diff options
author | Hugo Beauzée-Luyssen <hugo@beauzee.fr> | 2018-12-04 13:22:52 +0100 |
---|---|---|
committer | Hugo Beauzée-Luyssen <hugo@beauzee.fr> | 2018-12-19 09:46:01 +0100 |
commit | 362a0c30b79ccede7e5bc3a7747c3e7f1d30889a (patch) | |
tree | 9b350c7c69cbc488a6f304207f2a4a12cec4bc7e | |
parent | ba6c026615f83884bb8facdfb022776adae9de0c (diff) | |
download | gnutls-362a0c30b79ccede7e5bc3a7747c3e7f1d30889a.tar.gz |
verify-high2: Fix cert dir iteration on Win32
And especially when building for windows store, which only allows
unicode version of opendir & friends functions.
-rw-r--r-- | lib/x509/verify-high2.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/lib/x509/verify-high2.c b/lib/x509/verify-high2.c index f4a580bb05..6c7cf99012 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,47 @@ 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}; + + r = _gnutls_utf8_to_ucs2(dirname, strlen(dirname), &utf16); + if (r < 0) + return gnutls_assert_val(r); + dirp = _topendir((_TCHAR*)utf16.data); + gnutls_free(utf16.data); + if (dirp != NULL) { + do { + d = _treaddir(dirp); + if (d != NULL +#ifdef _DIRENT_HAVE_D_TYPE + && (d->d_type == DT_REG || d->d_type == DT_LNK || d->d_type == DT_UNKNOWN) +#endif + ) { + snprintf(path, sizeof(path), "%s/%S", + 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; + } + } + while (d != NULL); + _tclosedir(dirp); + } +#endif /* _WIN32 */ return r; } |