Author: tfaber
Date: Wed Jun 20 00:57:53 2012
New Revision: 56756
URL:
http://svn.reactos.org/svn/reactos?rev=56756&view=rev
Log:
[WS2_32]
- Do not manually allocate an incompatible hostent structure in FindEntryInHosts. Use
populate_hostent instead. Fixes buffer overflow in name resolution.
See issue #7126 for more details.
Modified:
trunk/reactos/dll/win32/ws2_32/include/ws2_32.h
trunk/reactos/dll/win32/ws2_32/misc/ns.c
Modified: trunk/reactos/dll/win32/ws2_32/include/ws2_32.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2_32/include/w…
==============================================================================
--- trunk/reactos/dll/win32/ws2_32/include/ws2_32.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ws2_32/include/ws2_32.h [iso-8859-1] Wed Jun 20 00:57:53 2012
@@ -76,7 +76,7 @@
/* ws2_32 internal Functions */
void check_hostent(struct hostent **he);
-void populate_hostent(struct hostent *he, char* name, DNS_A_DATA addr);
+void populate_hostent(struct hostent *he, char* name, IP4_ADDRESS addr);
void free_hostent(struct hostent *he);
void free_servent(struct servent* s);
Modified: trunk/reactos/dll/win32/ws2_32/misc/ns.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2_32/misc/ns.c…
==============================================================================
--- trunk/reactos/dll/win32/ws2_32/misc/ns.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ws2_32/misc/ns.c [iso-8859-1] Wed Jun 20 00:57:53 2012
@@ -529,7 +529,7 @@
}
}
-void populate_hostent(struct hostent *he, char* name, DNS_A_DATA addr)
+void populate_hostent(struct hostent *he, char* name, IP4_ADDRESS addr)
{
ASSERT(he);
@@ -561,8 +561,8 @@
WS_DbgPrint(MID_TRACE,("he->h_addr_list[0] %x\n",
he->h_addr_list[0]));
RtlCopyMemory(he->h_addr_list[0],
- &addr.IpAddress,
- sizeof(addr.IpAddress));
+ &addr,
+ sizeof(addr));
he->h_addr_list[1] = NULL;
}
@@ -813,51 +813,12 @@
return NULL;
}
- if( !p->Hostent )
- {
- p->Hostent = HeapAlloc(GlobalHeap, 0, sizeof(*p->Hostent));
- if( !p->Hostent )
- {
- WSASetLastError( WSATRY_AGAIN );
- return NULL;
- }
- }
-
- p->Hostent->h_name = HeapAlloc(GlobalHeap, 0, strlen(DnsName));
- if( !p->Hostent->h_name )
- {
- WSASetLastError( WSATRY_AGAIN );
- return NULL;
- }
-
- RtlCopyMemory(p->Hostent->h_name,
- DnsName,
- strlen(DnsName));
-
- p->Hostent->h_aliases = HeapAlloc(GlobalHeap, 0, sizeof(char *));
- if( !p->Hostent->h_aliases )
- {
- WSASetLastError( WSATRY_AGAIN );
- return NULL;
- }
-
- p->Hostent->h_aliases[0] = 0;
-
if (strstr(AddressStr, ":"))
{
DbgPrint("AF_INET6 NOT SUPPORTED!\n");
WSASetLastError(WSAEINVAL);
return NULL;
}
- else
- p->Hostent->h_addrtype = AF_INET;
-
- p->Hostent->h_addr_list = HeapAlloc(GlobalHeap, 0, sizeof(char *));
- if( !p->Hostent->h_addr_list )
- {
- WSASetLastError( WSATRY_AGAIN );
- return NULL;
- }
Address = inet_addr(AddressStr);
if (Address == INADDR_NONE)
@@ -866,18 +827,7 @@
return NULL;
}
- p->Hostent->h_addr_list[0] = HeapAlloc(GlobalHeap, 0, sizeof(Address));
- if( !p->Hostent->h_addr_list[0] )
- {
- WSASetLastError( WSATRY_AGAIN );
- return NULL;
- }
-
- RtlCopyMemory(p->Hostent->h_addr_list[0],
- &Address,
- sizeof(Address));
-
- p->Hostent->h_length = sizeof(Address);
+ populate_hostent(p->Hostent, DnsName, Address);
return p->Hostent;
}
@@ -996,7 +946,9 @@
{
WS_DbgPrint(MID_TRACE,("populating hostent\n"));
WS_DbgPrint(MID_TRACE,("pName is (%s)\n", curr->pName));
- populate_hostent(p->Hostent, (PCHAR)curr->pName, curr->Data.A);
+ populate_hostent(p->Hostent,
+ (PCHAR)curr->pName,
+ curr->Data.A.IpAddress);
DnsRecordListFree(dp, DnsFreeRecordList);
return p->Hostent;
}