Commit 82434dc5 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Convert host name to locale before IDN is applied

(cherry picked from commit 5c249026)
parent ac31abdb
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#endif #endif
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_charset.h>
#include <stddef.h> /* size_t */ #include <stddef.h> /* size_t */
#include <string.h> /* strlen(), memcpy(), memset(), strchr() */ #include <string.h> /* strlen(), memcpy(), memset(), strchr() */
...@@ -567,7 +568,7 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node, ...@@ -567,7 +568,7 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node,
struct addrinfo **res ) struct addrinfo **res )
{ {
struct addrinfo hints; struct addrinfo hints;
char psz_buf[NI_MAXHOST], *psz_node, psz_service[6]; char psz_buf[NI_MAXHOST], psz_service[6];
/* /*
* In VLC, we always use port number as integer rather than strings * In VLC, we always use port number as integer rather than strings
...@@ -631,29 +632,25 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node, ...@@ -631,29 +632,25 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node,
* - accept "" as NULL * - accept "" as NULL
* - ignore square brackets * - ignore square brackets
*/ */
if( ( node == NULL ) || (node[0] == '\0' ) ) if (node != NULL)
{ {
psz_node = NULL; if (node[0] == '[')
}
else
{
strlcpy( psz_buf, node, NI_MAXHOST );
psz_node = psz_buf;
if( psz_buf[0] == '[' )
{ {
char *ptr; size_t len = strlen (node + 1);
if ((len <= sizeof (psz_buf)) && (node[len] == ']'))
ptr = strrchr( psz_buf, ']' );
if( ( ptr != NULL ) && (ptr[1] == '\0' ) )
{ {
*ptr = '\0'; assert (len > 0);
psz_node++; memcpy (psz_buf, node + 1, len - 1);
psz_buf[len - 1] = '\0';
node = psz_buf;
} }
} }
if (node[0] == '\0')
node = NULL;
} }
int ret;
node = ToLocale (node);
#ifdef WIN32 #ifdef WIN32
/* /*
* Winsock tries to resolve numerical IPv4 addresses as AAAA * Winsock tries to resolve numerical IPv4 addresses as AAAA
...@@ -662,24 +659,26 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node, ...@@ -662,24 +659,26 @@ int vlc_getaddrinfo( vlc_object_t *p_this, const char *node,
if ((hints.ai_flags & AI_NUMERICHOST) == 0) if ((hints.ai_flags & AI_NUMERICHOST) == 0)
{ {
hints.ai_flags |= AI_NUMERICHOST; hints.ai_flags |= AI_NUMERICHOST;
ret = getaddrinfo (node, psz_service, &hints, res);
if (getaddrinfo (psz_node, psz_service, &hints, res) == 0) if (ret == 0)
return 0; goto out;
hints.ai_flags &= ~AI_NUMERICHOST; hints.ai_flags &= ~AI_NUMERICHOST;
} }
#endif #endif
#ifdef AI_IDN #ifdef AI_IDN
/* Run-time I18n Domain Names support */ /* Run-time I18n Domain Names support */
hints.ai_flags |= AI_IDN; hints.ai_flags |= AI_IDN;
int ret = getaddrinfo (psz_node, psz_service, &hints, res); ret = getaddrinfo (node, psz_service, &hints, res);
if (ret != EAI_BADFLAGS) if (ret != EAI_BADFLAGS)
return ret; goto out;
/* IDN not available: disable and retry without it */ /* IDN not available: disable and retry without it */
hints.ai_flags &= ~AI_IDN; hints.ai_flags &= ~AI_IDN;
#endif #endif
return getaddrinfo (psz_node, psz_service, &hints, res); ret = getaddrinfo (node, psz_service, &hints, res);
out:
LocaleFree (node);
return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment