ws2_32: Use realloc() in get_{host, proto, serv}ent_buffer().

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-08-18 23:25:49 -05:00 committed by Alexandre Julliard
parent 357fb2be9b
commit 4af902eb4e
1 changed files with 29 additions and 17 deletions

View File

@ -591,13 +591,18 @@ int WINAPI GetNameInfoW( const SOCKADDR *addr, socklen_t addr_len, WCHAR *host,
static struct hostent *get_hostent_buffer( unsigned int size ) static struct hostent *get_hostent_buffer( unsigned int size )
{ {
struct per_thread_data *data = get_per_thread_data(); struct per_thread_data *data = get_per_thread_data();
if (data->he_buffer) struct hostent *new_buffer;
if (data->he_len < size)
{ {
if (data->he_len >= size) return data->he_buffer; if (!(new_buffer = realloc( data->he_buffer, size )))
free( data->he_buffer ); {
SetLastError( WSAENOBUFS );
return NULL;
}
data->he_buffer = new_buffer;
data->he_len = size;
} }
data->he_buffer = malloc( (data->he_len = size) );
if (!data->he_buffer) SetLastError(WSAENOBUFS);
return data->he_buffer; return data->he_buffer;
} }
@ -1004,15 +1009,18 @@ static char *next_non_space( const char *p, const char *end )
static struct protoent *get_protoent_buffer( unsigned int size ) static struct protoent *get_protoent_buffer( unsigned int size )
{ {
struct per_thread_data *data = get_per_thread_data(); struct per_thread_data *data = get_per_thread_data();
struct protoent *new_buffer;
if (data->pe_buffer) if (data->pe_len < size)
{ {
if (data->pe_len >= size) return data->pe_buffer; if (!(new_buffer = realloc( data->pe_buffer, size )))
free( data->pe_buffer ); {
SetLastError( WSAENOBUFS );
return NULL;
}
data->pe_buffer = new_buffer;
data->pe_len = size;
} }
data->pe_len = size;
data->pe_buffer = malloc( size );
if (!data->pe_buffer) SetLastError( WSAENOBUFS );
return data->pe_buffer; return data->pe_buffer;
} }
@ -1187,14 +1195,18 @@ struct protoent * WINAPI getprotobynumber( int number )
static struct servent *get_servent_buffer( int size ) static struct servent *get_servent_buffer( int size )
{ {
struct per_thread_data *data = get_per_thread_data(); struct per_thread_data *data = get_per_thread_data();
if (data->se_buffer) struct servent *new_buffer;
if (data->se_len < size)
{ {
if (data->se_len >= size) return data->se_buffer; if (!(new_buffer = realloc( data->se_buffer, size )))
free( data->se_buffer ); {
SetLastError( WSAENOBUFS );
return NULL;
}
data->se_buffer = new_buffer;
data->se_len = size;
} }
data->se_len = size;
data->se_buffer = malloc( size );
if (!data->se_buffer) SetLastError( WSAENOBUFS );
return data->se_buffer; return data->se_buffer;
} }