From a11867126c7f13bef92fd5e19e1a16d4da1f367c Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Thu, 12 Jun 2014 03:47:49 +1000 Subject: [PATCH] Fixed segfault in common, changed casting of packets to static_cast This required that I switch from using a char array for the packet buffers to using malloc() and free(). They make more sense anyway, and I've learned (or relearned) something about casting. --- client/in_combat.cpp | 7 ++- client/in_world.cpp | 15 ++--- client/lobby_menu.cpp | 11 ++-- common/network/packet/serial_packet_type.hpp | 64 ++++++++++---------- common/network/serial/serial.cpp | 28 ++++----- makefile | 3 +- server/server_application.cpp | 39 ++++++------ 7 files changed, 85 insertions(+), 82 deletions(-) diff --git a/client/in_combat.cpp b/client/in_combat.cpp index b10164f..24b85e9 100644 --- a/client/in_combat.cpp +++ b/client/in_combat.cpp @@ -86,10 +86,11 @@ void InCombat::FrameStart() { void InCombat::Update(double delta) { //suck in and process all waiting packets - char packetBuffer[MAX_PACKET_SIZE]; - while(network.Receive(reinterpret_cast(packetBuffer))) { - HandlePacket(reinterpret_cast(packetBuffer)); + SerialPacket* packetBuffer = static_cast(malloc(MAX_PACKET_SIZE)); + while(network.Receive(packetBuffer)) { + HandlePacket(packetBuffer); } + free(static_cast(packetBuffer)); //TODO: more } diff --git a/client/in_world.cpp b/client/in_world.cpp index 3aadc51..9779a71 100644 --- a/client/in_world.cpp +++ b/client/in_world.cpp @@ -95,10 +95,11 @@ void InWorld::FrameStart() { void InWorld::Update(double delta) { //suck in and process all waiting packets - char packetBuffer[MAX_PACKET_SIZE]; - while(network.Receive(reinterpret_cast(packetBuffer))) { - HandlePacket(reinterpret_cast(packetBuffer)); + SerialPacket* packetBuffer = static_cast(malloc(MAX_PACKET_SIZE)); + while(network.Receive(packetBuffer)) { + HandlePacket(packetBuffer); } + free(static_cast(packetBuffer)); //update the characters for (auto& it : characterMap) { @@ -254,16 +255,16 @@ void InWorld::HandlePacket(SerialPacket* const argPacket) { HandleDisconnect(argPacket); break; case SerialPacketType::CHARACTER_NEW: - HandleCharacterNew(dynamic_cast(argPacket)); + HandleCharacterNew(static_cast(argPacket)); break; case SerialPacketType::CHARACTER_DELETE: - HandleCharacterDelete(dynamic_cast(argPacket)); + HandleCharacterDelete(static_cast(argPacket)); break; case SerialPacketType::CHARACTER_UPDATE: - HandleCharacterUpdate(dynamic_cast(argPacket)); + HandleCharacterUpdate(static_cast(argPacket)); break; case SerialPacketType::REGION_CONTENT: - HandleRegionContent(dynamic_cast(argPacket)); + HandleRegionContent(static_cast(argPacket)); break; //handle errors default: diff --git a/client/lobby_menu.cpp b/client/lobby_menu.cpp index 3056db3..facfa9f 100644 --- a/client/lobby_menu.cpp +++ b/client/lobby_menu.cpp @@ -85,10 +85,11 @@ void LobbyMenu::FrameStart() { void LobbyMenu::Update(double delta) { //suck in and process all waiting packets - char packetBuffer[MAX_PACKET_SIZE]; - while(network.Receive(reinterpret_cast(packetBuffer))) { - HandlePacket(reinterpret_cast(packetBuffer)); + SerialPacket* packetBuffer = static_cast(malloc(MAX_PACKET_SIZE)); + while(network.Receive(packetBuffer)) { + HandlePacket(packetBuffer); } + free(static_cast(packetBuffer)); } void LobbyMenu::FrameEnd() { @@ -204,10 +205,10 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) { void LobbyMenu::HandlePacket(SerialPacket* const argPacket) { switch(argPacket->type) { case SerialPacketType::BROADCAST_RESPONSE: - HandleBroadcastResponse(dynamic_cast(argPacket)); + HandleBroadcastResponse(static_cast(argPacket)); break; case SerialPacketType::JOIN_RESPONSE: - HandleJoinResponse(dynamic_cast(argPacket)); + HandleJoinResponse(static_cast(argPacket)); break; //handle errors default: diff --git a/common/network/packet/serial_packet_type.hpp b/common/network/packet/serial_packet_type.hpp index dceffaa..9142dcc 100644 --- a/common/network/packet/serial_packet_type.hpp +++ b/common/network/packet/serial_packet_type.hpp @@ -32,77 +32,77 @@ enum class SerialPacketType { //keep alive //ping => pong - PING, - PONG, + PING = 1, + PONG = 2, //search for the server list //none => server name, player count, version info (and source address) - BROADCAST_REQUEST, - BROADCAST_RESPONSE, + BROADCAST_REQUEST = 3, + BROADCAST_RESPONSE = 4, //try to join the server //username, and password => client index, account index - JOIN_REQUEST, - JOIN_RESPONSE, - JOIN_REJECTION, + JOIN_REQUEST = 5, + JOIN_RESPONSE = 6, + JOIN_REJECTION = 7, //mass update of all surrounding content //character.x, character.y => packet barrage - SYNCHRONIZE, + SYNCHRONIZE = 8, //disconnect from the server //autentication, account index => disconnect that account - DISCONNECT, + DISCONNECT = 9, //shut down the server //autentication => disconnect, shutdown - SHUTDOWN, + SHUTDOWN = 10, //map data //room index, region.x, region.y => room index, region.x, region.y, region content - REGION_REQUEST, - REGION_CONTENT, + REGION_REQUEST = 11, + REGION_CONTENT = 12, //combat data //TODO: system incomplete - COMBAT_NEW, - COMBAT_DELETE, - COMBAT_UPDATE, + COMBAT_NEW = 13, + COMBAT_DELETE = 14, + COMBAT_UPDATE = 15, - COMBAT_ENTER_REQUEST, - COMBAT_ENTER_RESPONSE, + COMBAT_ENTER_REQUEST = 16, + COMBAT_ENTER_RESPONSE = 17, - COMBAT_EXIT_REQUEST, - COMBAT_EXIT_RESPONSE, + COMBAT_EXIT_REQUEST = 18, + COMBAT_EXIT_RESPONSE = 19, //TODO: COMBAT info - COMBAT_REJECTION, + COMBAT_REJECTION = 20, //character data //character data => etc. - CHARACTER_NEW, - CHARACTER_DELETE, - CHARACTER_UPDATE, + CHARACTER_NEW = 21, + CHARACTER_DELETE = 22, + CHARACTER_UPDATE = 23, //authentication, character index => character stats - CHARACTER_STATS_REQUEST, - CHARACTER_STATS_RESPONSE, + CHARACTER_STATS_REQUEST= 24, + CHARACTER_STATS_RESPONSE = 25, //character new => character rejection, disconnect? - CHARACTER_REJECTION, + CHARACTER_REJECTION = 26, //enemy data //enemy data => etc. - ENEMY_NEW, - ENEMY_DELETE, - ENEMY_UPDATE, + ENEMY_NEW = 27, + ENEMY_DELETE = 28, + ENEMY_UPDATE = 29, - ENEMY_STATS_REQUEST, - ENEMY_STATS_RESPONSE, + ENEMY_STATS_REQUEST = 30, + ENEMY_STATS_RESPONSE = 31, //enemy index => enemy doens't exist - ENEMY_REJECTION, + ENEMY_REJECTION= 32, //NOTE: more packet types go here diff --git a/common/network/serial/serial.cpp b/common/network/serial/serial.cpp index 423f6c1..1e76e4b 100644 --- a/common/network/serial/serial.cpp +++ b/common/network/serial/serial.cpp @@ -56,7 +56,7 @@ void serializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::CHARACTER_UPDATE: case SerialPacketType::CHARACTER_STATS_REQUEST: case SerialPacketType::CHARACTER_STATS_RESPONSE: - serializeCharacter(dynamic_cast(packet), buffer); + serializeCharacter(static_cast(packet), buffer); break; //client info @@ -65,7 +65,7 @@ void serializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::SYNCHRONIZE: case SerialPacketType::DISCONNECT: case SerialPacketType::SHUTDOWN: - serializeClient(dynamic_cast(packet), buffer); + serializeClient(static_cast(packet), buffer); break; //combat info @@ -79,7 +79,7 @@ void serializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::COMBAT_EXIT_REQUEST: case SerialPacketType::COMBAT_EXIT_RESPONSE: - serializeCombat(dynamic_cast(packet), buffer); + serializeCombat(static_cast(packet), buffer); break; //enemy info @@ -88,21 +88,21 @@ void serializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::ENEMY_UPDATE: case SerialPacketType::ENEMY_STATS_REQUEST: case SerialPacketType::ENEMY_STATS_RESPONSE: - serializeEnemy(dynamic_cast(packet), buffer); + serializeEnemy(static_cast(packet), buffer); break; //region info case SerialPacketType::REGION_REQUEST: - serializeRegionFormat(dynamic_cast(packet), buffer); + serializeRegionFormat(static_cast(packet), buffer); break; case SerialPacketType::REGION_CONTENT: - serializeRegionContent(dynamic_cast(packet), buffer); + serializeRegionContent(static_cast(packet), buffer); break; //server info case SerialPacketType::BROADCAST_RESPONSE: - serializeServer(dynamic_cast(packet), buffer); + serializeServer(static_cast(packet), buffer); break; } } @@ -132,7 +132,7 @@ void deserializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::CHARACTER_UPDATE: case SerialPacketType::CHARACTER_STATS_REQUEST: case SerialPacketType::CHARACTER_STATS_RESPONSE: - deserializeCharacter(dynamic_cast(packet), buffer); + deserializeCharacter(static_cast(packet), buffer); break; //client info @@ -141,7 +141,7 @@ void deserializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::SYNCHRONIZE: case SerialPacketType::DISCONNECT: case SerialPacketType::SHUTDOWN: - deserializeClient(dynamic_cast(packet), buffer); + deserializeClient(static_cast(packet), buffer); break; //combat info @@ -155,7 +155,7 @@ void deserializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::COMBAT_EXIT_REQUEST: case SerialPacketType::COMBAT_EXIT_RESPONSE: - serializeCombat(dynamic_cast(packet), buffer); + serializeCombat(static_cast(packet), buffer); break; //enemy info @@ -164,21 +164,21 @@ void deserializePacket(SerialPacketBase* packet, void* buffer) { case SerialPacketType::ENEMY_UPDATE: case SerialPacketType::ENEMY_STATS_REQUEST: case SerialPacketType::ENEMY_STATS_RESPONSE: - serializeEnemy(dynamic_cast(packet), buffer); + serializeEnemy(static_cast(packet), buffer); break; //region info case SerialPacketType::REGION_REQUEST: - deserializeRegionFormat(dynamic_cast(packet), buffer); + deserializeRegionFormat(static_cast(packet), buffer); break; case SerialPacketType::REGION_CONTENT: - deserializeRegionContent(dynamic_cast(packet), buffer); + deserializeRegionContent(static_cast(packet), buffer); break; //server info case SerialPacketType::BROADCAST_RESPONSE: - deserializeServer(dynamic_cast(packet), buffer); + deserializeServer(static_cast(packet), buffer); break; } } \ No newline at end of file diff --git a/makefile b/makefile index 27fd80e..aaf0418 100644 --- a/makefile +++ b/makefile @@ -3,8 +3,7 @@ #MKDIR=mkdir #RM=del /y -CXXFLAGS+=-static-libgcc -static-libstdc++ -CFLAGS+=-static-libgcc +CXXFLAGS+=-static-libgcc -static-libstdc++ -g export diff --git a/server/server_application.cpp b/server/server_application.cpp index 6fd85d9..372655f 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -134,17 +134,18 @@ void ServerApplication::Init(int argc, char** argv) { } void ServerApplication::Proc() { - char packetBuffer[MAX_PACKET_SIZE]; + SerialPacket* packetBuffer = static_cast(malloc(MAX_PACKET_SIZE)); while(running) { //suck in the waiting packets & process them - while(network.Receive(reinterpret_cast(packetBuffer))) { - HandlePacket(reinterpret_cast(packetBuffer)); + while(network.Receive(packetBuffer)) { + HandlePacket(packetBuffer); } //update the internals //TODO: update the internals i.e. player positions //give the computer a break SDL_Delay(10); } + free(static_cast(packetBuffer)); } void ServerApplication::Quit() { @@ -168,21 +169,21 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { switch(argPacket->type) { //basic connections case SerialPacketType::BROADCAST_REQUEST: - HandleBroadcastRequest(dynamic_cast(argPacket)); + HandleBroadcastRequest(static_cast(argPacket)); break; case SerialPacketType::JOIN_REQUEST: - HandleJoinRequest(dynamic_cast(argPacket)); + HandleJoinRequest(static_cast(argPacket)); break; case SerialPacketType::DISCONNECT: - HandleDisconnect(dynamic_cast(argPacket)); + HandleDisconnect(static_cast(argPacket)); break; case SerialPacketType::SHUTDOWN: - HandleShutdown(dynamic_cast(argPacket)); + HandleShutdown(static_cast(argPacket)); break; //map management case SerialPacketType::REGION_REQUEST: - HandleRegionRequest(dynamic_cast(argPacket)); + HandleRegionRequest(static_cast(argPacket)); break; //combat management @@ -190,14 +191,14 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { //character management case SerialPacketType::CHARACTER_NEW: - HandleCharacterNew(dynamic_cast(argPacket)); + HandleCharacterNew(static_cast(argPacket)); break; case SerialPacketType::CHARACTER_DELETE: - HandleCharacterDelete(dynamic_cast(argPacket)); + HandleCharacterDelete(static_cast(argPacket)); break; case SerialPacketType::CHARACTER_UPDATE: case SerialPacketType::CHARACTER_STATS_REQUEST: - HandleCharacterUpdate(dynamic_cast(argPacket)); + HandleCharacterUpdate(static_cast(argPacket)); break; //enemy management @@ -205,12 +206,12 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) { //mismanagement case SerialPacketType::SYNCHRONIZE: - HandleSynchronize(dynamic_cast(argPacket)); + HandleSynchronize(static_cast(argPacket)); break; //handle errors default: - throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in the server: " + to_string_custom(int(argPacket->type)))); + throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in the server: " + to_string_custom(static_cast(argPacket->type)) )); break; } } @@ -228,7 +229,7 @@ void ServerApplication::HandleBroadcastRequest(SerialPacket* const argPacket) { newPacket.playerCount = characterMgr.GetContainer()->size(); newPacket.version = NETWORK_VERSION; - network.SendTo(&argPacket->srcAddress, dynamic_cast(&newPacket)); + network.SendTo(&argPacket->srcAddress, static_cast(&newPacket)); } void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) { @@ -251,7 +252,7 @@ void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) { newPacket.clientIndex = clientUID; newPacket.accountIndex = accountIndex; - network.SendTo(&newClient.address, dynamic_cast(&newPacket)); + network.SendTo(&newClient.address, static_cast(&newPacket)); //finished this routine clientMap[clientUID++] = newClient; @@ -264,7 +265,7 @@ void ServerApplication::HandleDisconnect(ClientPacket* const argPacket) { //forward to the specified client network.SendTo( &clientMap[ accountMgr.GetAccount(argPacket->accountIndex)->clientIndex ].address, - dynamic_cast(argPacket) + static_cast(argPacket) ); //save and unload this account's characters @@ -315,7 +316,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->pager.GetRegion(argPacket->x, argPacket->y); //send the content - network.SendTo(&argPacket->srcAddress, dynamic_cast(argPacket)); + network.SendTo(&argPacket->srcAddress, static_cast(argPacket)); } //------------------------- @@ -435,7 +436,7 @@ void ServerApplication::HandleSynchronize(ClientPacket* const argPacket) { for (auto& it : *characterMgr.GetContainer()) { newPacket.characterIndex = it.first; CopyCharacterToPacket(&newPacket, it.first); - network.SendTo(&client.address, dynamic_cast(&newPacket)); + network.SendTo(&client.address, static_cast(&newPacket)); } //TODO: more in HandleSynchronize() @@ -458,7 +459,7 @@ void ServerApplication::PumpCharacterUnload(int uid) { CharacterPacket newPacket; newPacket.type = SerialPacketType::CHARACTER_DELETE; newPacket.characterIndex = uid; - PumpPacket(dynamic_cast(&newPacket)); + PumpPacket(static_cast(&newPacket)); } void ServerApplication::CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex) {