From 1d772b01d01fa056ccb1d0861f55776099cdddf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 29 Oct 2015 21:41:49 +0100 Subject: [PATCH] Plug memory leak and validate getsockopt result --- src/network/network.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index f8a438ba5f..82b95a8e34 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -324,6 +324,7 @@ int NetworkAddress::ResolveFunc(void* pointer) memcpy(&(*ss), res->ai_addr, res->ai_addrlen); *ss_len = res->ai_addrlen; *status = RESOLVE_OK; + freeaddrinfo(res); } else { *status = RESOLVE_FAILED; } @@ -584,7 +585,12 @@ void Network::UpdateClient() case NETWORK_STATUS_CONNECTING:{ int error = 0; socklen_t len = sizeof(error); - getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + int result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (result != 0) + { + log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); + break; + } if (error != 0) { log_error("Connection failed %d", error); connectfailed = true; @@ -602,9 +608,14 @@ void Network::UpdateClient() timeout.tv_sec = 0; timeout.tv_usec = 0; if (select(server_connection.socket + 1, NULL, &writeFD, NULL, &timeout) > 0) { - int error = 0; + error = 0; socklen_t len = sizeof(error); - getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + result = getsockopt(server_connection.socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len); + if (result != 0) + { + log_error("getsockopt failed with error %d", LAST_SOCKET_ERROR()); + break; + } if (error == 0) { status = NETWORK_STATUS_CONNECTED; Client_Send_AUTH(OPENRCT2_VERSION, gConfigNetwork.player_name, "");