Erich Hoover : ws2_32: Fix allocating a hostent with no h_aliases list.

Alexandre Julliard julliard at winehq.org
Tue Dec 15 09:40:19 CST 2009


Module: wine
Branch: master
Commit: 896af79093f3d6f8a81b4ed5c6fd41e0e91b7186
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=896af79093f3d6f8a81b4ed5c6fd41e0e91b7186

Author: Erich Hoover <ehoover at mines.edu>
Date:   Mon Dec 14 08:30:14 2009 -0700

ws2_32: Fix allocating a hostent with no h_aliases list.

---

 dlls/ws2_32/socket.c |   40 ++++++++++++++++++++++------------------
 1 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index e6668b9..9a65cb0 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3639,7 +3639,11 @@ static struct WS_hostent* WS_get_local_ips( char *hostname )
     /* Allocate a hostent and enough memory for all the IPs,
      * including the NULL at the end of the list.
      */
-    hostlist = WS_create_he(hostname, 0, numroutes, TRUE);
+    hostlist = WS_create_he(hostname, 1, numroutes+1, TRUE);
+    if (hostlist == NULL)
+        goto cleanup; /* Failed to allocate a hostent for the list of IPs */
+    hostlist->h_addr_list[numroutes] = NULL; /* NULL-terminate the address list */
+    hostlist->h_aliases[0] = NULL; /* NULL-terminate the alias list */
     hostlist->h_addrtype = AF_INET;
     hostlist->h_length = sizeof(struct in_addr); /* = 4 */
     /* Reorder the entries when placing them in the host list, Windows expects
@@ -4602,9 +4606,14 @@ static int list_dup(char** l_src, char** l_to, int item_size)
  *
  * Creates the entry with enough memory for the name, aliases
  * addresses, and the address pointers.  Also copies the name
- * and sets up all the pointers.  If "fill_address" is set then
+ * and sets up all the pointers.  If "fill_addresses" is set then
  * sufficient memory for the addresses is also allocated and the
  * address pointers are set to this memory.
+ *
+ * NOTE: The alias and address lists must be allocated with room
+ * for the NULL item terminating the list.  This is true even if
+ * the list has no items ("aliases" and "addresses" must be
+ * at least "1", a truly empty list is invalid).
  */
 static struct WS_hostent *WS_create_he(char *name, int aliases, int addresses, int fill_addresses)
 {
@@ -4616,11 +4625,9 @@ static struct WS_hostent *WS_create_he(char *name, int aliases, int addresses, i
                 sizeof(char *)*aliases +
                 sizeof(char *)*addresses);
 
-    /* Place addresses in the allocated memory, making sure to have enough
-     * room for the NULL at the end of the list.
-     */
+    /* Allocate enough memory for the addresses */
     if (fill_addresses)
-        size += sizeof(struct in_addr)*(addresses+1);
+        size += sizeof(struct in_addr)*addresses;
 
     if (!(p_to = check_buffer_he(size))) return NULL;
     memset(p_to, 0, size);
@@ -4630,24 +4637,21 @@ static struct WS_hostent *WS_create_he(char *name, int aliases, int addresses, i
     strcpy(p, name);
     p += strlen(p) + 1;
 
-    if (aliases != 0)
-    {
-        p_to->h_aliases = (char **)p;
-        p += sizeof(char *)*aliases;
-    }
-    if (addresses != 0)
-    {
-        p_to->h_addr_list = (char **)p;
-        p += sizeof(char *)*addresses;
-    }
+    p_to->h_aliases = (char **)p;
+    p += sizeof(char *)*aliases;
+    p_to->h_addr_list = (char **)p;
+    p += sizeof(char *)*addresses;
     if (fill_addresses)
     {
         int i;
 
-        /* Fill in the list of address pointers and NULL-terminate the list*/
+        /* NOTE: h_aliases must be filled in manually, leave these
+         * pointers NULL (already set to NULL by memset earlier).
+         */
+
+        /* Fill in the list of address pointers */
         for (i = 0; i < addresses; i++)
             p_to->h_addr_list[i] = (p += sizeof(struct in_addr));
-        p_to->h_addr_list[i] = NULL;
         p += sizeof(struct in_addr);
     }
     return p_to;




More information about the wine-cvs mailing list