Author: spetreolle
Date: Mon Mar 30 18:10:36 2015
New Revision: 66981

URL: http://svn.reactos.org/svn/reactos?rev=66981&view=rev
Log:
[IPHLPAPI]
Make GetAdaptersAddresses work, with parameters check.
More work is needed :
-it returns the loopback, which shouldn't appear with default flags.
-the required size is fixed.

Modified:
    trunk/reactos/dll/win32/iphlpapi/address.c

Modified: trunk/reactos/dll/win32/iphlpapi/address.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/address.c?rev=66981&r1=66980&r2=66981&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/address.c  [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/address.c  [iso-8859-1] Mon Mar 30 
18:10:36 2015
@@ -9,7 +9,7 @@
 #include "iphlpapi_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
-
+#if 1
 /* Helper for GetAdaptersAddresses:
  * Retrieves the list of network adapters from tcpip.sys */
 static
@@ -283,12 +283,22 @@
     ULONG i;
     ULONG TotalSize = 0, RemainingSize;
     BYTE* Ptr = (BYTE*)pAdapterAddresses;
+    DWORD MIN_SIZE = 15 * 1024;
+    PIP_ADAPTER_ADDRESSES PreviousAA = NULL;
 
     FIXME("GetAdaptersAddresses - Semi Stub: Family %u, Flags 0x%08x, Reserved 
%p, pAdapterAddress %p, pOutBufLen %p.\n",
         Family, Flags, Reserved, pAdapterAddresses, pOutBufLen);
 
     if (!pOutBufLen)
         return ERROR_INVALID_PARAMETER;
+
+    // FIXME: the exact needed size should be computed first, BEFORE doing any 
write to the output buffer.
+    // As suggested by MSDN, require a 15 KB buffer, which allows to React 
properly to length checks.
+    if(!Ptr || *pOutBufLen < MIN_SIZE)
+    {
+        *pOutBufLen = MIN_SIZE;
+        return ERROR_BUFFER_OVERFLOW;
+    }
 
     switch(Family)
     {
@@ -334,7 +344,7 @@
     /* Let's see if we got any adapter. */
     for (i = 0; i < InterfacesCount; i++)
     {
-        PIP_ADAPTER_ADDRESSES CurrentAA = (PIP_ADAPTER_ADDRESSES)Ptr, 
PreviousAA = NULL;
+        PIP_ADAPTER_ADDRESSES CurrentAA = (PIP_ADAPTER_ADDRESSES)Ptr;
         ULONG CurrentAASize = 0;
 
         if (InterfacesList[i].tei_entity == IF_ENTITY)
@@ -345,6 +355,10 @@
 
             /* Remember we got one */
             AdaptersCount++;
+
+            /* Set the pointer to this instance in the previous one*/
+            if(PreviousAA)
+                PreviousAA->Next = CurrentAA;
 
             /* Of course we need some space for the base structure. */
             CurrentAASize = sizeof(IP_ADAPTER_ADDRESSES);
@@ -409,7 +423,6 @@
                 CurrentAA->Mtu = Entry->if_mtu;
                 CurrentAA->IfType = Entry->if_type;
                 CurrentAA->OperStatus = Entry->if_operstatus;
-                CurrentAA->Next = PreviousAA;
                 /* Next items */
                 Ptr = (BYTE*)(CurrentAA + 1);
 
@@ -628,6 +641,7 @@
     HeapFree(GetProcessHeap(), 0, InterfacesList);
     NtClose(TcpFile);
     *pOutBufLen = TotalSize;
+    TRACE("TotalSize: %x\n", *pOutBufLen);
     return ERROR_SUCCESS;
 
 Error:
@@ -637,3 +651,4 @@
     NtClose(TcpFile);
     return RtlNtStatusToDosError(Status);
 }
+#endif


Reply via email to