summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Beauzée-Luyssen <hugo@beauzee.fr>2019-02-18 14:41:56 +0100
committerHugo Beauzée-Luyssen <hugo@beauzee.fr>2019-02-21 15:24:56 +0100
commit56f3941d3f9e6e9e8e0efa177408110daf6ac10f (patch)
treedba0ac46b50d55b5b6af92c9b0d8806b1e3450f6
parent17e399701b9e03f0304c70b08b7aa9f2333dac6f (diff)
downloadgnutls-56f3941d3f9e6e9e8e0efa177408110daf6ac10f.tar.gz
Revert "Revert "verify-high2: Fix cert dir iteration on Win32""
This reverts commit 681330882da19099eea360fab141cab937c45677. Signed-off-by: Hugo Beauzée-Luyssen <hugo@beauzee.fr> This revert also contains the fix to the original commit (invalid utf8->utf16 conversion) and a minor simplification of the _treaddir loop.
-rw-r--r--lib/x509/verify-high2.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/lib/x509/verify-high2.c b/lib/x509/verify-high2.c
index f4a580bb05..56d52c0b1a 100644
--- a/lib/x509/verify-high2.c
+++ b/lib/x509/verify-high2.c
@@ -45,6 +45,10 @@
# endif
#endif
+#ifdef _WIN32
+# include <tchar.h>
+#endif
+
/* Convenience functions for verify-high functionality
*/
@@ -386,12 +390,14 @@ int load_dir_certs(const char *dirname,
unsigned int tl_flags, unsigned int tl_vflags,
unsigned type, unsigned crl)
{
- DIR *dirp;
- struct dirent *d;
int ret;
int r = 0;
char path[GNUTLS_PATH_MAX];
+#if !defined(_WIN32) || !defined(_UNICODE)
+ DIR *dirp;
+ struct dirent *d;
+
dirp = opendir(dirname);
if (dirp != NULL) {
do {
@@ -422,7 +428,48 @@ int load_dir_certs(const char *dirname,
while (d != NULL);
closedir(dirp);
}
+#else /* _WIN32 */
+
+ _TDIR *dirp;
+ struct _tdirent *d;
+ gnutls_datum_t utf16 = {NULL, 0};
+#ifdef WORDS_BIGENDIAN
+ r = _gnutls_utf8_to_ucs2(dirname, strlen(dirname), &utf16, 1);
+#else
+ r = _gnutls_utf8_to_ucs2(dirname, strlen(dirname), &utf16, 0);
+#endif
+ if (r < 0)
+ return gnutls_assert_val(r);
+ dirp = _topendir((_TCHAR*)utf16.data);
+ gnutls_free(utf16.data);
+ if (dirp != NULL) {
+ while ((d = _treaddir(dirp)) != NULL) {
+#ifdef _DIRENT_HAVE_D_TYPE
+ if (d->d_type == DT_REG || d->d_type == DT_LNK || d->d_type == DT_UNKNOWN)
+#endif
+ {
+ snprintf(path, sizeof(path), "%s/%ls",
+ dirname, d->d_name);
+
+ if (crl != 0) {
+ ret =
+ gnutls_x509_trust_list_add_trust_file
+ (list, NULL, path, type, tl_flags,
+ tl_vflags);
+ } else {
+ ret =
+ gnutls_x509_trust_list_add_trust_file
+ (list, path, NULL, type, tl_flags,
+ tl_vflags);
+ }
+ if (ret >= 0)
+ r += ret;
+ }
+ }
+ _tclosedir(dirp);
+ }
+#endif /* _WIN32 */
return r;
}