diff options
author | Tim Rühsen <tim.ruehsen@gmx.de> | 2019-02-22 10:23:31 +0000 |
---|---|---|
committer | Tim Rühsen <tim.ruehsen@gmx.de> | 2019-02-22 10:23:31 +0000 |
commit | 8bff12e4cfa7d37ccdd00edf39b1c6c1f6b69c4b (patch) | |
tree | 7685b241eeb67958cbaf3b7c8cfddf066f372bd3 | |
parent | b4abf441ae1686fd602971dd0c0493a3c7e15fd1 (diff) | |
parent | 4c5309c266df33d62d61381bc93428a072c516a4 (diff) | |
download | gnutls-8bff12e4cfa7d37ccdd00edf39b1c6c1f6b69c4b.tar.gz |
Merge branch 'use_topendir_fixed' into 'master'
Re-introduce topendir on Windows with Unicode support
See merge request gnutls/gnutls!932
-rw-r--r-- | lib/str-iconv.c | 5 | ||||
-rw-r--r-- | lib/system.h | 2 | ||||
-rw-r--r-- | lib/x509/pkcs12_encr.c | 2 | ||||
-rw-r--r-- | lib/x509/verify-high2.c | 60 | ||||
-rw-r--r-- | tests/conv-utf8.c | 6 |
5 files changed, 59 insertions, 16 deletions
diff --git a/lib/str-iconv.c b/lib/str-iconv.c index f5e3943e21..9606613e48 100644 --- a/lib/str-iconv.c +++ b/lib/str-iconv.c @@ -117,9 +117,8 @@ int _gnutls_ucs2_to_utf8(const void *data, size_t size, return ret; } -/* This is big-endian output only */ int _gnutls_utf8_to_ucs2(const void *data, size_t size, - gnutls_datum_t * output) + gnutls_datum_t * output, unsigned be) { int ret; size_t dstlen, nrm_size = 0, tmp_size = 0; @@ -150,7 +149,7 @@ int _gnutls_utf8_to_ucs2(const void *data, size_t size, } /* convert to BE */ - change_u16_endianness(dst, (uint8_t*)tmp_dst, dstlen, 1); + change_u16_endianness(dst, (uint8_t*)tmp_dst, dstlen, be); dst[dstlen] = 0; dst[dstlen+1] = 0; diff --git a/lib/system.h b/lib/system.h index 2e77322e1d..ccae6475f8 100644 --- a/lib/system.h +++ b/lib/system.h @@ -100,7 +100,7 @@ int _gnutls_find_config_path(char *path, size_t max_size); int _gnutls_ucs2_to_utf8(const void *data, size_t size, gnutls_datum_t * output, unsigned bigendian); int _gnutls_utf8_to_ucs2(const void *data, size_t size, - gnutls_datum_t * output); + gnutls_datum_t * output, unsigned be); void _gnutls_global_set_gettime_function(gnutls_gettime_func gettime_func); diff --git a/lib/x509/pkcs12_encr.c b/lib/x509/pkcs12_encr.c index 9d9c1d64a9..76fbb4e8ab 100644 --- a/lib/x509/pkcs12_encr.c +++ b/lib/x509/pkcs12_encr.c @@ -96,7 +96,7 @@ _gnutls_pkcs12_string_to_key(const mac_entry_st * me, return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); ucs2.size = 2; } else { - rc = _gnutls_utf8_to_ucs2(pw, pwlen, &ucs2); + rc = _gnutls_utf8_to_ucs2(pw, pwlen, &ucs2, 1); if (rc < 0) return gnutls_assert_val(rc); diff --git a/lib/x509/verify-high2.c b/lib/x509/verify-high2.c index f4a580bb05..ff574ababe 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,21 +390,21 @@ 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 { - d = readdir(dirp); - if (d != NULL + while ((d = readdir(dirp)) != NULL) { #ifdef _DIRENT_HAVE_D_TYPE - && (d->d_type == DT_REG || d->d_type == DT_LNK || d->d_type == DT_UNKNOWN) + if (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); @@ -419,10 +423,50 @@ int load_dir_certs(const char *dirname, r += ret; } } - 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; } diff --git a/tests/conv-utf8.c b/tests/conv-utf8.c index 73f4ff3abd..9d630e73d0 100644 --- a/tests/conv-utf8.c +++ b/tests/conv-utf8.c @@ -35,7 +35,7 @@ #include <cmocka.h> int _gnutls_utf8_to_ucs2(const void *data, size_t size, - gnutls_datum_t * output); + gnutls_datum_t * output, unsigned be); int _gnutls_ucs2_to_utf8(const void *data, size_t size, gnutls_datum_t * output, unsigned be); @@ -60,7 +60,7 @@ static void PRINT(const char *str, unsigned char *val, unsigned int size) static void fname(void **glob_state) \ { \ gnutls_datum_t out; \ - int ret = _gnutls_utf8_to_ucs2(utf8, strlen(utf8), &out); \ + int ret = _gnutls_utf8_to_ucs2(utf8, strlen(utf8), &out, 1); \ assert_int_equal(ret, 0); \ if (out.size != sizeof(utf16)-1 || memcmp(utf16, out.data, out.size) != 0) { PRINT("got: ", out.data, out.size); \ PRINT("expected: ", (unsigned char*)utf16, sizeof(utf16)-1); } \ @@ -86,7 +86,7 @@ static void fname(void **glob_state) \ static void fname(void **glob_state) \ { \ gnutls_datum_t out; \ - int ret = _gnutls_utf8_to_ucs2(utf8, utf8_size, &out); \ + int ret = _gnutls_utf8_to_ucs2(utf8, utf8_size, &out, 1); \ assert_int_not_equal(ret, 0); \ } |