summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Rühsen <tim.ruehsen@gmx.de>2019-02-22 10:23:31 +0000
committerTim Rühsen <tim.ruehsen@gmx.de>2019-02-22 10:23:31 +0000
commit8bff12e4cfa7d37ccdd00edf39b1c6c1f6b69c4b (patch)
tree7685b241eeb67958cbaf3b7c8cfddf066f372bd3
parentb4abf441ae1686fd602971dd0c0493a3c7e15fd1 (diff)
parent4c5309c266df33d62d61381bc93428a072c516a4 (diff)
downloadgnutls-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.c5
-rw-r--r--lib/system.h2
-rw-r--r--lib/x509/pkcs12_encr.c2
-rw-r--r--lib/x509/verify-high2.c60
-rw-r--r--tests/conv-utf8.c6
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); \
}