Timo Teräs : iphlpapi: Fix GetAdaptersAddresses return values.

Alexandre Julliard julliard at winehq.org
Mon Dec 27 10:03:58 CST 2010


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

Author: Timo Teräs <timo.teras at iki.fi>
Date:   Mon Dec 27 09:56:21 2010 +0200

iphlpapi: Fix GetAdaptersAddresses return values.

---

 dlls/iphlpapi/iphlpapi_main.c  |    5 ++++-
 dlls/iphlpapi/tests/iphlpapi.c |   21 ++++++++++++++-------
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index d734c39..3995a17 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1115,10 +1115,13 @@ ULONG WINAPI GetAdaptersAddresses(ULONG family, ULONG flags, PVOID reserved,
         {
             if (aa->IfType != IF_TYPE_SOFTWARE_LOOPBACK && aa->OperStatus == IfOperStatusUp)
                 aa->DnsSuffix = dnsSuffix;
+            else
+                aa->DnsSuffix = (WCHAR *)((BYTE*)dnsSuffix + dns_suffix_size - 2);
         }
         ret = ERROR_SUCCESS;
     }
-    if (*buflen < total_size) ret = ERROR_BUFFER_OVERFLOW;
+    else
+        ret = ERROR_BUFFER_OVERFLOW;
     *buflen = total_size;
 
     TRACE("num adapters %u\n", table->numIndexes);
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 823e596..a747423 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -819,7 +819,7 @@ static void testWin2KFunctions(void)
 static void test_GetAdaptersAddresses(void)
 {
     ULONG ret, size;
-    IP_ADAPTER_ADDRESSES *aa;
+    IP_ADAPTER_ADDRESSES *aa, *ptr;
     IP_ADAPTER_UNICAST_ADDRESS *ua;
 
     if (!gGetAdaptersAddresses)
@@ -831,17 +831,25 @@ static void test_GetAdaptersAddresses(void)
     ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, NULL);
     ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", ret);
 
-    size = 0;
+    /* size should be ignored and overwritten if buffer is NULL */
+    size = 0x7fffffff;
     ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size);
     ok(ret == ERROR_BUFFER_OVERFLOW, "expected ERROR_BUFFER_OVERFLOW, got %u\n", ret);
     if (ret != ERROR_BUFFER_OVERFLOW) return;
 
-    aa = HeapAlloc(GetProcessHeap(), 0, size);
-    ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, aa, &size);
+    ptr = HeapAlloc(GetProcessHeap(), 0, size);
+    ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, ptr, &size);
     ok(!ret, "expected ERROR_SUCCESS got %u\n", ret);
 
-    while (!ret && winetest_debug > 1 && aa)
+    for (aa = ptr; !ret && aa; aa = aa->Next)
     {
+        ok(aa->DnsSuffix != NULL, "DnsSuffix is not a valid pointer\n");
+        ok(aa->Description != NULL, "Description is not a valid pointer\n");
+        ok(aa->FriendlyName != NULL, "FriendlyName is not a valid pointer\n");
+
+        if (winetest_debug <= 1)
+            continue;
+
         trace("Length:                %u\n", S(U(*aa)).Length);
         trace("IfIndex:               %u\n", S(U(*aa)).IfIndex);
         trace("Next:                  %p\n", aa->Next);
@@ -877,9 +885,8 @@ static void test_GetAdaptersAddresses(void)
         trace("IfType:                %u\n", aa->IfType);
         trace("OperStatus:            %u\n", aa->OperStatus);
         trace("\n");
-        aa = aa->Next;
     }
-    HeapFree(GetProcessHeap(), 0, aa);
+    HeapFree(GetProcessHeap(), 0, ptr);
 }
 
 START_TEST(iphlpapi)




More information about the wine-cvs mailing list