Kai Blin : ws2_32: Handle gethostbyname call failure, add tests.
Alexandre Julliard
julliard at winehq.org
Mon Apr 28 08:01:40 CDT 2008
Module: wine
Branch: master
Commit: c0a3ac5006603baa08161fb78c738c6a9520b6df
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0a3ac5006603baa08161fb78c738c6a9520b6df
Author: Kai Blin <kai.blin at gmail.com>
Date: Mon Apr 28 10:37:39 2008 +0200
ws2_32: Handle gethostbyname call failure, add tests.
---
dlls/ws2_32/socket.c | 2 +-
dlls/ws2_32/tests/sock.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+), 1 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 1fe0034..c24a049 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3244,7 +3244,7 @@ struct WS_hostent* WINAPI WS_gethostbyname(const char* name)
#else
LeaveCriticalSection( &csWSgetXXXbyYYY );
#endif
- if (retval->h_addr_list[0][0] == 127 &&
+ if (retval && retval->h_addr_list[0][0] == 127 &&
strcmp(name, "localhost") != 0)
{
/* hostname != "localhost" but has loopback address. replace by our
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 8dc1f12..3c314d4 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1765,6 +1765,73 @@ static void test_dns(void)
ok(h != NULL, "gethostbyname(\"\") failed with %d\n", h_errno);
}
+/* Our winsock headers don't define gethostname because it conflicts with the
+ * definition in unistd.h. Define it here to get rid of the warning. */
+
+int gethostname(char *name, int namelen);
+
+static void test_gethostbyname_hack(void)
+{
+ struct hostent *he;
+ char name[256];
+ static BYTE loopback[] = {127, 0, 0, 1};
+ static BYTE magic_loopback[] = {127, 12, 34, 56};
+ int ret;
+
+ ret = gethostname(name, 256);
+ ok(ret == 0, "gethostname() call failed: %d\n", WSAGetLastError());
+
+ he = gethostbyname("localhost");
+ ok(he != NULL, "gethostbyname(\"localhost\") failed: %d\n", h_errno);
+ if(he)
+ {
+ if(he->h_length != 4)
+ {
+ skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
+ return;
+ }
+
+ ok(memcmp(he->h_addr_list[0], loopback, he->h_length) == 0,
+ "gethostbyname(\"localhost\") returned %d.%d.%d.%d\n",
+ he->h_addr_list[0][0], he->h_addr_list[0][1], he->h_addr_list[0][2],
+ he->h_addr_list[0][3]);
+ }
+
+ /* No reason to test further with NULL hostname */
+ if(name == NULL)
+ return;
+
+ if(strcmp(name, "localhost") == 0)
+ {
+ skip("hostname seems to be \"localhost\", skipping test.\n");
+ return;
+ }
+
+ he = NULL;
+ he = gethostbyname(name);
+ ok(he != NULL, "gethostbyname(\"%s\") failed: %d\n", name, h_errno);
+ if(he)
+ {
+ if(he->h_length != 4)
+ {
+ skip("h_length is %d, not IPv4, skipping test.\n", he->h_length);
+ return;
+ }
+
+ if (he->h_addr_list[0][0] == 127)
+ {
+ ok(memcmp(he->h_addr_list[0], magic_loopback, he->h_length) == 0,
+ "gethostbyname(\"%s\") returned %d.%d.%d.%d not 127.12.34.56\n",
+ name, he->h_addr_list[0][0], he->h_addr_list[0][1],
+ he->h_addr_list[0][2], he->h_addr_list[0][3]);
+ }
+ }
+
+ he = NULL;
+ he = gethostbyname("someweirdandbogusname");
+ ok(he == NULL, "gethostbyname(\"someweirdandbogusname\") succeeded.\n");
+}
+
static void test_inet_addr(void)
{
u_long addr;
@@ -1997,6 +2064,7 @@ START_TEST( sock )
test_getsockname();
test_inet_addr();
test_dns();
+ test_gethostbyname_hack();
test_send();
test_write_events();
More information about the wine-cvs
mailing list