summaryrefslogtreecommitdiff
path: root/lib/url.c
diff options
context:
space:
mode:
authorViktor Szakats <commit@vsz.me>2021-06-15 12:10:48 +0000
committerViktor Szakats <commit@vsz.me>2021-06-15 12:10:48 +0000
commit2026124691a82d3a628233b109cca60e99cdf839 (patch)
tree7380720f89d9a017ee7df1d505244dee570bc83a /lib/url.c
parentb67d3ba73e98cba63dc6246ee0da22ea803ec3e8 (diff)
downloadcurl-2026124691a82d3a628233b109cca60e99cdf839.tar.gz
idn: fix libidn2 with windows unicode builds
Unicode Windows builds use UTF-8 strings internally in libcurl, so make sure to call the UTF-8 flavour of the libidn2 API. Also document that Windows builds with libidn2 and UNICODE do expect CURLOPT_URL as an UTF-8 string. Reported-by: dEajL3kA on github Assisted-by: Jay Satiro Reviewed-by: Marcel Raad Closes #7246 Fixes #7228
Diffstat (limited to 'lib/url.c')
-rw-r--r--lib/url.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/url.c b/lib/url.c
index e92335772..9a96e6a93 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -62,6 +62,14 @@
#ifdef USE_LIBIDN2
#include <idn2.h>
+#if defined(WIN32) && defined(UNICODE)
+#define IDN2_LOOKUP(name, host, flags) \
+ idn2_lookup_u8((const uint8_t *)name, (uint8_t **)host, flags)
+#else
+#define IDN2_LOOKUP(name, host, flags) \
+ idn2_lookup_ul((const char *)name, (char **)host, flags)
+#endif
+
#elif defined(USE_WIN32_IDN)
/* prototype for curl_win32_idn_to_ascii() */
bool curl_win32_idn_to_ascii(const char *in, char **out);
@@ -1585,12 +1593,12 @@ CURLcode Curl_idnconvert_hostname(struct Curl_easy *data,
#else
int flags = IDN2_NFC_INPUT;
#endif
- int rc = idn2_lookup_ul((const char *)host->name, &ace_hostname, flags);
+ int rc = IDN2_LOOKUP(host->name, &ace_hostname, flags);
if(rc != IDN2_OK)
/* fallback to TR46 Transitional mode for better IDNA2003
compatibility */
- rc = idn2_lookup_ul((const char *)host->name, &ace_hostname,
- IDN2_TRANSITIONAL);
+ rc = IDN2_LOOKUP(host->name, &ace_hostname,
+ IDN2_TRANSITIONAL);
if(rc == IDN2_OK) {
host->encalloc = (char *)ace_hostname;
/* change the name pointer to point to the encoded hostname */