From 00a347159c44747228b4bb68ea0db4a75ed71b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Thu, 29 Oct 2015 21:24:54 +0100 Subject: [PATCH 1/2] Type fixes, remove unused variable --- src/scenario.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/scenario.c b/src/scenario.c index 81264a5f3c..292d174672 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -817,7 +817,7 @@ int scenario_get_num_packed_objects_to_write() rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF || (entry->flags & 0xF0)) continue; count++; @@ -835,7 +835,7 @@ int scenario_write_packed_objects(SDL_RWops* rw) int i; rct_object_entry_extended *entry = (rct_object_entry_extended*)0x00F3F03C; for (i = 0; i < 721; i++, entry++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF || (entry->flags & 0xF0)) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF || (entry->flags & 0xF0)) continue; if (!write_object_file(rw, (rct_object_entry*)entry)) @@ -875,7 +875,7 @@ int scenario_write_available_objects(FILE *file) rct_object_entry_extended *srcEntry = (rct_object_entry_extended*)0x00F3F03C; rct_object_entry *dstEntry = (rct_object_entry*)buffer; for (i = 0; i < 721; i++) { - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) memset(dstEntry, 0xFF, sizeof(rct_object_entry)); else *dstEntry = *((rct_object_entry*)srcEntry); @@ -1021,10 +1021,9 @@ int scenario_save(SDL_RWops* rw, int flags) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); @@ -1095,10 +1094,9 @@ int scenario_save_network(SDL_RWops* rw) memcpy(&s6->info, (rct_s6_info*)0x0141F570, sizeof(rct_s6_info)); for (int i = 0; i < 721; i++) { - uint32 chunkPtr = GET_RIDE_ENTRY(i); rct_object_entry_extended *entry = &(RCT2_ADDRESS(0x00F3F03C, rct_object_entry_extended)[i]); - if (GET_RIDE_ENTRY(i) == 0xFFFFFFFF) { + if (GET_RIDE_ENTRY(i) == (void *)0xFFFFFFFF) { memset(&s6->objects[i], 0xFF, sizeof(rct_object_entry)); } else { s6->objects[i] = *((rct_object_entry*)entry); 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 2/2] 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, "");