From f9af40a1330a8226d72c96bff56cdb4ab895dac7 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 9 Jun 2015 09:19:43 -0400 Subject: [PATCH] Fix a FIXME in the WinXP inet_pton() implementation https://bugzilla.gnome.org/show_bug.cgi?id=749912 --- gio/ginetaddress.c | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/gio/ginetaddress.c b/gio/ginetaddress.c index 9e069a463..c83f750cd 100644 --- a/gio/ginetaddress.c +++ b/gio/ginetaddress.c @@ -398,39 +398,27 @@ inet_pton (gint family, struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; gint len = sizeof (sa); - /* We need to make sure to not pass a string of the form - * "IPv4addr:port" or "[IPv6addr]:port" to WSAStringToAddress(), - * since it would accept them (returning both the address and the - * port), but we only want to accept standalone IP addresses. (In - * the IPv6 case, WINE actually only checks for the ']', not the - * '[', which is why we do the same here.) - */ if (family != AF_INET && family != AF_INET6) { WSASetLastError (WSAEAFNOSUPPORT); return -1; } - if (!strchr (addr_string, ':')) - { - if (WSAStringToAddress ((LPTSTR) addr_string, AF_INET, NULL, (LPSOCKADDR) &sa, &len) == 0) - { - /* XXX: Figure out when WSAStringToAddress() accepts a IPv4 address but the - numbers-and-dots address is actually not complete. This code will be - removed once XP/Server 2003 support is dropped... */ - *(IN_ADDR *) addr = sin->sin_addr; - return 1; - } - } - if (!strchr (addr_string, ']')) - { - if (WSAStringToAddress ((LPTSTR) addr_string, AF_INET6, NULL, (LPSOCKADDR) &sa, &len) == 0) - { - *(IN6_ADDR *) addr = sin6->sin6_addr; - return 1; - } - } - return 0; + /* WSAStringToAddress() will accept various not-an-IP-address + * strings like "127.0.0.1:80", "[1234::5678]:80", "127.1", etc. + */ + if (!g_hostname_is_ip_address (addr_string)) + return 0; + + if (WSAStringToAddress ((LPTSTR) addr_string, family, NULL, (LPSOCKADDR) &sa, &len) != 0) + return 0; + + if (family == AF_INET) + *(IN_ADDR *)addr = sin->sin_addr; + else + *(IN6_ADDR *)addr = sin6->sin6_addr; + + return 1; } }