Wine: gethostbyname implementation in WS2_32 is buggy

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Fri May 16 14:43:20 CDT 2003


>>>>> "rzroli" ==   <rzoli at yahoo.com> writes:

    rzoli> Hi, I am not confident how this patch-submission bussiness
    rzoli> works, so I will just quickly describe what's wrong and how to
    rzoli> fix it.

    rzoli> The current implementation of gethostbyname in WS2_32 (located
    rzoli> in winsock/socket.c) doesn't handle a null string argument
    rzoli> correctly.

    rzoli> According to MS definition of gethostbyname, when it receives a
    rzoli> null argument, it should return the same result as if a call to
    rzoli> gethostname was made. Currently Wine doesn't do this: it simply
    rzoli> crashes.

    rzoli> Fix is simple: add something like: if (name == NULL) return
    rzoli> __ws_gethostbyname( "localhost", WS_DUP_LINEAR );

    rzoli> I hope this helps you out a bit.  Good luck with the project,
    rzoli> it's been very useful to me.

Do something like
cvs -d $CVSROOT diff -u wine/dlls/winsock/socket.c wine/dlls/winsock/tests/sock.c > winsock_patch

Write a Changelog:
    wine/dlls/winsock/socket.c: gethostbyname
    NULL as name is handled like gethostbyname
    (as spooted by  <rzoli at yahoo.com>)

and attach the patch
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.126
diff -u -r1.126 socket.c
--- wine/dlls/winsock/socket.c	13 May 2003 04:43:44 -0000	1.126
+++ wine/dlls/winsock/socket.c	16 May 2003 19:38:15 -0000
@@ -2937,6 +2937,8 @@
 struct WS_hostent* WINAPI WS_gethostbyname(const char* name)
 {
     TRACE( "%s\n", debugstr_a(name) );
+    if (name == NULL)
+      return __ws_gethostbyname("localhost", WS_DUP_LINEAR );
     return __ws_gethostbyname( name, WS_DUP_LINEAR );
 }
 
Index: wine/dlls/winsock/tests/sock.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/tests/sock.c,v
retrieving revision 1.9
diff -u -r1.9 sock.c
--- wine/dlls/winsock/tests/sock.c	2 Apr 2003 01:38:42 -0000	1.9
+++ wine/dlls/winsock/tests/sock.c	16 May 2003 19:38:19 -0000
@@ -676,6 +676,14 @@
     }
 };
 
+void test_gethostbyname(void)
+{
+  struct hostent* ret;
+
+  ret = gethostbyname(NULL);
+  ok (ret !=0, "gethostbyname(NULL) failed");
+
+}
 /**************** Main program  ***************/
 
 START_TEST( sock )
@@ -689,6 +697,6 @@
         do_test (  &tests[i] );
         trace ( " **** TEST %d COMPLETE **** \n", i );
     }
-
+    test_gethostbyname();
     Exit();
 }



More information about the wine-patches mailing list