From 4af902eb4eacc33b9cf89a9093362115d9ebf6ad Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 18 Aug 2021 23:25:49 -0500 Subject: [PATCH] ws2_32: Use realloc() in get_{host, proto, serv}ent_buffer(). Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/ws2_32/protocol.c | 46 ++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c index 93464232d32..492400b17a7 100644 --- a/dlls/ws2_32/protocol.c +++ b/dlls/ws2_32/protocol.c @@ -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 ) { 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; - free( data->he_buffer ); + if (!(new_buffer = realloc( data->he_buffer, size ))) + { + 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; } @@ -1004,15 +1009,18 @@ static char *next_non_space( const char *p, const char *end ) static struct protoent *get_protoent_buffer( unsigned int size ) { 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; - free( data->pe_buffer ); + if (!(new_buffer = realloc( data->pe_buffer, size ))) + { + 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; } @@ -1187,14 +1195,18 @@ struct protoent * WINAPI getprotobynumber( int number ) static struct servent *get_servent_buffer( int size ) { 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; - free( data->se_buffer ); + if (!(new_buffer = realloc( data->se_buffer, size ))) + { + 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; }