From 07cbcc0beceb1e15e995b7f65b2d40c6411eb5a3 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 20 Aug 2010 23:53:10 +0000 Subject: [PATCH] - added a bunch of null terminations to all char buffers in network protocol --- source/glest_game/network/connection_slot.cpp | 4 +- source/glest_game/network/network_interface.h | 4 +- source/glest_game/network/network_message.cpp | 62 ++++++++++++++----- source/glest_game/network/network_types.h | 5 ++ .../glest_game/network/server_interface.cpp | 3 +- .../sources/platform/posix/socket.cpp | 3 + 6 files changed, 61 insertions(+), 20 deletions(-) diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index 3e1614dc..da3a6e8c 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -25,7 +25,6 @@ using namespace std; using namespace Shared::Util; -//using namespace Shared::Platform; namespace Glest{ namespace Game{ @@ -209,7 +208,8 @@ void ConnectionSlot::update(bool checkForNewClients) { if(checkForNewClients == true) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s] BEFORE accept new client connection, serverInterface->getOpenSlotCount() = %d\n",__FILE__,__FUNCTION__,serverInterface->getOpenSlotCount()); bool hasOpenSlots = (serverInterface->getOpenSlotCount() > 0); - if(serverInterface->getServerSocket()->hasDataToRead() == true) { + if(serverInterface->getServerSocket() != NULL && + serverInterface->getServerSocket()->hasDataToRead() == true) { SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] playerIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,playerIndex); socket = serverInterface->getServerSocket()->accept(); SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] playerIndex = %d\n",__FILE__,__FUNCTION__,__LINE__,playerIndex); diff --git a/source/glest_game/network/network_interface.h b/source/glest_game/network/network_interface.h index 0334b80b..abef0edb 100644 --- a/source/glest_game/network/network_interface.h +++ b/source/glest_game/network/network_interface.h @@ -107,8 +107,8 @@ public: static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; } static DisplayMessageFunction getDisplayMessageFunction() { return pCB_DisplayMessage; } - string getIp() const {return getSocket()->getIp();} - string getHostName() const {return getSocket()->getHostName();} + string getIp() const {return Socket::getIp();} + string getHostName() const {return Socket::getHostName();} virtual void sendMessage(const NetworkMessage* networkMessage); NetworkMessageType getNextMessageType(bool checkHasDataFirst = false); diff --git a/source/glest_game/network/network_message.cpp b/source/glest_game/network/network_message.cpp index e33d2f8b..169a924c 100644 --- a/source/glest_game/network/network_message.cpp +++ b/source/glest_game/network/network_message.cpp @@ -136,7 +136,10 @@ NetworkMessageIntro::NetworkMessageIntro(const string &versionString, const stri } bool NetworkMessageIntro::receive(Socket* socket){ - return NetworkMessage::receive(socket, &data, sizeof(data)); + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + data.name.nullTerminate(); + data.versionString.nullTerminate(); + return result; } void NetworkMessageIntro::send(Socket* socket) const{ @@ -260,7 +263,17 @@ void NetworkMessageLaunch::buildGameSettings(GameSettings *gameSettings) const{ } bool NetworkMessageLaunch::receive(Socket* socket){ - return NetworkMessage::receive(socket, &data, sizeof(data)); + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + data.description.nullTerminate(); + data.map.nullTerminate(); + data.tileset.nullTerminate(); + data.tech.nullTerminate(); + for(int i= 0; igetMap().c_str()); } -bool NetworkMessageSynchNetworkGameData::receive(Socket* socket) -{ - return NetworkMessage::receive(socket, &data, sizeof(data)); +bool NetworkMessageSynchNetworkGameData::receive(Socket* socket) { + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + + data.map.nullTerminate(); + data.tileset.nullTerminate(); + data.tech.nullTerminate(); + + return result; } void NetworkMessageSynchNetworkGameData::send(Socket* socket) const { @@ -512,9 +535,12 @@ NetworkMessageSynchNetworkGameDataFileCRCCheck::NetworkMessageSynchNetworkGameDa data.fileName = fileName; } -bool NetworkMessageSynchNetworkGameDataFileCRCCheck::receive(Socket* socket) -{ - return NetworkMessage::receive(socket, &data, sizeof(data)); +bool NetworkMessageSynchNetworkGameDataFileCRCCheck::receive(Socket* socket) { + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + + data.fileName.nullTerminate(); + + return result; } void NetworkMessageSynchNetworkGameDataFileCRCCheck::send(Socket* socket) const { @@ -535,9 +561,12 @@ NetworkMessageSynchNetworkGameDataFileGet::NetworkMessageSynchNetworkGameDataFil data.fileName = fileName; } -bool NetworkMessageSynchNetworkGameDataFileGet::receive(Socket* socket) -{ - return NetworkMessage::receive(socket, &data, sizeof(data)); +bool NetworkMessageSynchNetworkGameDataFileGet::receive(Socket* socket) { + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + + data.fileName.nullTerminate(); + + return result; } void NetworkMessageSynchNetworkGameDataFileGet::send(Socket* socket) const { @@ -572,9 +601,12 @@ SwitchSetupRequest::SwitchSetupRequest(string selectedFactionName, int8 currentF data.toTeam = toTeam; } -bool SwitchSetupRequest::receive(Socket* socket) -{ - return NetworkMessage::receive(socket, &data, sizeof(data)); +bool SwitchSetupRequest::receive(Socket* socket) { + bool result = NetworkMessage::receive(socket, &data, sizeof(data)); + + data.selectedFactionName.nullTerminate(); + + return result; } void SwitchSetupRequest::send(Socket* socket) const diff --git a/source/glest_game/network/network_types.h b/source/glest_game/network/network_types.h index 33b92931..b6982c53 100644 --- a/source/glest_game/network/network_types.h +++ b/source/glest_game/network/network_types.h @@ -46,6 +46,11 @@ public: int maxBufferSize = sizeof(buffer) / sizeof(buffer[0]); strncpy(buffer, str.c_str(), min(S-1,maxBufferSize-1)); } + void nullTerminate() { + int maxBufferSize = sizeof(buffer) / sizeof(buffer[0]); + buffer[maxBufferSize-1] = '\0'; + } + string getString() const {return buffer;} }; diff --git a/source/glest_game/network/server_interface.cpp b/source/glest_game/network/server_interface.cpp index 462d0e0b..27ed6004 100644 --- a/source/glest_game/network/server_interface.cpp +++ b/source/glest_game/network/server_interface.cpp @@ -1178,6 +1178,7 @@ void ServerInterface::updateListen() { return; } + MutexSafeWrapper safeMutex(&serverSynchAccessor); int openSlotCount= 0; for(int i= 0; iisConnected() == false); @@ -1187,7 +1188,7 @@ void ServerInterface::updateListen() { } } - MutexSafeWrapper safeMutex(&serverSynchAccessor); + //MutexSafeWrapper safeMutex(&serverSynchAccessor); serverSocket.listen(openSlotCount); safeMutex.ReleaseLock(); } diff --git a/source/shared_lib/sources/platform/posix/socket.cpp b/source/shared_lib/sources/platform/posix/socket.cpp index 5a7a7a95..a9028380 100644 --- a/source/shared_lib/sources/platform/posix/socket.cpp +++ b/source/shared_lib/sources/platform/posix/socket.cpp @@ -1702,7 +1702,10 @@ Socket *ServerSocket::accept() { struct sockaddr_in cli_addr; socklen_t clilen = sizeof(cli_addr); char client_host[100]=""; + MutexSafeWrapper safeMutex(&dataSynchAccessor); PLATFORM_SOCKET newSock= ::accept(sock, (struct sockaddr *) &cli_addr, &clilen); + safeMutex.ReleaseLock(); + if(isSocketValid(&newSock) == false) { char szBuf[1024]="";