mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 23:48:12 +00:00
[WS2_32]
- Rewrite completely broken free_hostent and free_servent functions - Readability improvements to check_hostent and populate_hostent svn path=/trunk/; revision=56755
This commit is contained in:
parent
63e9d00bb0
commit
da39b38e47
1 changed files with 54 additions and 47 deletions
|
@ -518,15 +518,13 @@ void check_hostent(struct hostent **he)
|
|||
sizeof(struct hostent) + MAX_HOSTNAME_LEN + 1);
|
||||
|
||||
new_he->h_name = (PCHAR)(new_he + 1);
|
||||
new_he->h_aliases = 0;
|
||||
new_he->h_aliases = NULL;
|
||||
new_he->h_addrtype = 0; // AF_INET
|
||||
new_he->h_length = 0; // sizeof(in_addr)
|
||||
new_he->h_addr_list = HeapAlloc(GlobalHeap,
|
||||
0,
|
||||
HEAP_ZERO_MEMORY,
|
||||
sizeof(char *) * 2);
|
||||
|
||||
RtlZeroMemory(new_he->h_addr_list,
|
||||
sizeof(char *) * 2);
|
||||
*he = new_he;
|
||||
}
|
||||
}
|
||||
|
@ -544,7 +542,7 @@ void populate_hostent(struct hostent *he, char* name, DNS_A_DATA addr)
|
|||
|
||||
if( !he->h_aliases ) {
|
||||
he->h_aliases = HeapAlloc(GlobalHeap, 0, sizeof(char *));
|
||||
he->h_aliases[0] = 0;
|
||||
he->h_aliases[0] = NULL;
|
||||
}
|
||||
he->h_addrtype = AF_INET;
|
||||
he->h_length = sizeof(IN_ADDR); //sizeof(struct in_addr);
|
||||
|
@ -563,33 +561,33 @@ void populate_hostent(struct hostent *he, char* name, DNS_A_DATA addr)
|
|||
WS_DbgPrint(MID_TRACE,("he->h_addr_list[0] %x\n", he->h_addr_list[0]));
|
||||
|
||||
RtlCopyMemory(he->h_addr_list[0],
|
||||
(char*)&addr.IpAddress,
|
||||
&addr.IpAddress,
|
||||
sizeof(addr.IpAddress));
|
||||
|
||||
he->h_addr_list[1] = 0;
|
||||
he->h_addr_list[1] = NULL;
|
||||
}
|
||||
|
||||
|
||||
#define HFREE(x) if(x) { HeapFree(GlobalHeap, 0, (x)); x=0; }
|
||||
void free_hostent(struct hostent *he)
|
||||
{
|
||||
if(he)
|
||||
int i;
|
||||
|
||||
if (he)
|
||||
{
|
||||
char *next = 0;
|
||||
HFREE(he->h_name);
|
||||
if(he->h_aliases)
|
||||
{
|
||||
next = he->h_aliases[0];
|
||||
while(next) { HFREE(next); next++; }
|
||||
}
|
||||
if(he->h_addr_list)
|
||||
{
|
||||
next = he->h_addr_list[0];
|
||||
while(next) { HFREE(next); next++; }
|
||||
}
|
||||
HFREE(he->h_addr_list);
|
||||
HFREE(he->h_aliases);
|
||||
HFREE(he);
|
||||
if (he->h_name)
|
||||
HeapFree(GlobalHeap, 0, he->h_name);
|
||||
if (he->h_aliases)
|
||||
{
|
||||
for (i = 0; he->h_aliases[i]; i++)
|
||||
HeapFree(GlobalHeap, 0, he->h_aliases[i]);
|
||||
HeapFree(GlobalHeap, 0, he->h_aliases);
|
||||
}
|
||||
if (he->h_addr_list)
|
||||
{
|
||||
for (i = 0; he->h_addr_list[i]; i++)
|
||||
HeapFree(GlobalHeap, 0, he->h_addr_list[i]);
|
||||
HeapFree(GlobalHeap, 0, he->h_addr_list);
|
||||
}
|
||||
HeapFree(GlobalHeap, 0, he);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -672,13 +670,22 @@ struct hostent defined in w32api/include/winsock2.h
|
|||
|
||||
void free_servent(struct servent* s)
|
||||
{
|
||||
char* next;
|
||||
HFREE(s->s_name);
|
||||
next = s->s_aliases[0];
|
||||
while(next) { HFREE(next); next++; }
|
||||
s->s_port = 0;
|
||||
HFREE(s->s_proto);
|
||||
HFREE(s);
|
||||
int i;
|
||||
|
||||
if (s)
|
||||
{
|
||||
if (s->s_name)
|
||||
HeapFree(GlobalHeap, 0, s->s_name);
|
||||
if (s->s_aliases)
|
||||
{
|
||||
for (i = 0; s->s_aliases[i]; i++)
|
||||
HeapFree(GlobalHeap, 0, s->s_aliases[i]);
|
||||
HeapFree(GlobalHeap, 0, s->s_aliases);
|
||||
}
|
||||
if (s->s_proto)
|
||||
HeapFree(GlobalHeap, 0, s->s_proto);
|
||||
HeapFree(GlobalHeap, 0, s);
|
||||
}
|
||||
}
|
||||
|
||||
/* This function is far from perfect but it works enough */
|
||||
|
|
Loading…
Reference in a new issue