[IPHLPAPI] Use if_descrlen field for determining the length of
authorVictor Perevertkin <victor@perevertkin.ru>
Sun, 30 Jun 2019 12:34:46 +0000 (15:34 +0300)
committerVictor Perevertkin <victor@perevertkin.ru>
Fri, 5 Jul 2019 19:49:12 +0000 (22:49 +0300)
if_descr in IFEntry structure. This fixes heap corruption on GCC8.
CORE-16088

dll/win32/iphlpapi/ifenum_reactos.c
dll/win32/iphlpapi/iphlpapi_main.c

index 8bbdd63..41958ea 100644 (file)
@@ -97,13 +97,14 @@ NTSTATUS tdiGetMibForIfEntity
            entry->ent.if_speed,
            entry->ent.if_physaddrlen);
     TRACE("  if_physaddr .................... %02x:%02x:%02x:%02x:%02x:%02x\n"
-           "  if_descr ....................... %s\n",
+           "  if_descr ....................... %*s\n",
            entry->ent.if_physaddr[0] & 0xff,
            entry->ent.if_physaddr[1] & 0xff,
            entry->ent.if_physaddr[2] & 0xff,
            entry->ent.if_physaddr[3] & 0xff,
            entry->ent.if_physaddr[4] & 0xff,
            entry->ent.if_physaddr[5] & 0xff,
+           entry->ent.if_descrlen,
            entry->ent.if_descr);
     TRACE("} status %08x\n",status);
 
@@ -332,7 +333,7 @@ NTSTATUS getInterfaceInfoByName( HANDLE tcpFile, char *name, IFInfo *info ) {
     if( NT_SUCCESS(status) )
     {
         for( i = 0; i < numInterfaces; i++ ) {
-            if( !strcmp((PCHAR)ifInfo[i].if_info.ent.if_descr, name) ) {
+            if( !strncmp((PCHAR)ifInfo[i].if_info.ent.if_descr, name, ifInfo[i].if_info.ent.if_descrlen) ) {
                 memcpy( info, &ifInfo[i], sizeof(*info) );
                 break;
             }
@@ -352,20 +353,19 @@ const char *getInterfaceNameByIndex(DWORD index)
 {
     IFInfo ifInfo;
     HANDLE tcpFile;
-    char *interfaceName = 0, *adapter_name = 0;
+    char *interfaceName = NULL;
     NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getInterfaceInfoByIndex( tcpFile, index, &ifInfo );
 
         if( NT_SUCCESS(status) ) {
-            adapter_name = (char *)ifInfo.if_info.ent.if_descr;
-
             interfaceName = HeapAlloc( GetProcessHeap(), 0,
-                                       strlen(adapter_name) + 1 );
-            if (!interfaceName) return NULL;
-
-            strcpy( interfaceName, adapter_name );
+                                       ifInfo.if_info.ent.if_descrlen + 1 );
+            if( interfaceName ) {
+              memcpy(interfaceName, ifInfo.if_info.ent.if_descr, ifInfo.if_info.ent.if_descrlen);
+              interfaceName[ifInfo.if_info.ent.if_descrlen] = '\0';
+            }
         }
 
         closeTcpFile( tcpFile );
index 242fb3b..8bcde12 100644 (file)
@@ -3200,10 +3200,10 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetAdaptersAddresses(ULONG Family,ULONG Flags,PVO
 
             /* Friendly name */
             if (!(Flags & GAA_FLAG_SKIP_FRIENDLY_NAME))
-                requiredSize += strlen((char *)ifInfo.if_info.ent.if_descr) + 1; //FIXME
+                requiredSize += ifInfo.if_info.ent.if_descrlen + 1; //FIXME
 
             /* Adapter name */
-            requiredSize += strlen((char *)ifInfo.if_info.ent.if_descr) + 1;
+            requiredSize += ifInfo.if_info.ent.if_descrlen + 1;
 
             /* Unicast address */
             if (!(Flags & GAA_FLAG_SKIP_UNICAST))
@@ -3248,7 +3248,7 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetAdaptersAddresses(ULONG Family,ULONG Flags,PVO
 
             /* Adapter name */
             currentAddress->AdapterName = (PVOID)currentLocation;
-            currentLocation += strlen((char *)ifInfo.if_info.ent.if_descr) + 1;
+            currentLocation += ifInfo.if_info.ent.if_descrlen + 1;
 
             /* Unicast address */
             if (!(Flags & GAA_FLAG_SKIP_UNICAST))
@@ -3297,7 +3297,8 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetAdaptersAddresses(ULONG Family,ULONG Flags,PVO
             currentAddress->IfIndex = indexTable->indexes[i];
 
             /* Adapter name */
-            strcpy(currentAddress->AdapterName, (char *)ifInfo.if_info.ent.if_descr);
+            memcpy(currentAddress->AdapterName, ifInfo.if_info.ent.if_descr, ifInfo.if_info.ent.if_descrlen);
+            currentAddress->AdapterName[ifInfo.if_info.ent.if_descrlen] = '\0';
 
             if (!(Flags & GAA_FLAG_SKIP_UNICAST))
             {