I have been stuck on this for hours, for some reason I am getting a Segmentation fault error only on Linux. It only happens with packets of length 17 or more characters. I am using Enet library to send the packets. Anyone can help me out, I don't know what I am missing here ...
Here is a screenshot of gdb output Here is the server side sample:
void GameServer::start()
{
if (!m_isRunning)
m_isRunning = true;
ENetEvent event;
//ENetPacket *packet;
while (m_isRunning)
{
while (enet_host_service(server, &event, 1000) > 0)
{
switch (event.type)
{
case ENET_EVENT_TYPE_CONNECT:
std::cout << "A new client connected from ";
std::cout << event.peer->address.host << " ";
std::cout << event.peer->address.port << std::endl;
break;
case ENET_EVENT_TYPE_DISCONNECT:
printf("%s disconnected.\n", event.peer->data);
delete (char*)event.peer->data;
break;
case ENET_EVENT_TYPE_RECEIVE:
{
std::cout << "A packet of length ";
std::cout << event.packet->dataLength;
std::cout << " containing ";
std::cout << event.packet->data;
std::cout << " was received from ";
printf("%s", event.peer->data);
std::cout << " on channel ";
std::cout << event.channelID << std::endl;
// Split the packet data, ex: packettype:data:data
std::vector<std::string> tokens;
std::string data;
std::istringstream split((const char *)event.packet->data);
// Process the packet data
while (std::getline(split, data, ':')) Line 89: Crash here
tokens.push_back(data);
if (tokens.size() > 1)
{
//pc = player connected so we will broadcast the name to all peers
if (tokens[0] == "pc")
{
if (tokens.size() == 2)
{
char* data = new char[tokens[1].length() + 1];
strcpy(data, tokens[1].c_str());
event.peer->data = (void*)data;
for (size_t i = 0; i < server->connectedPeers; i++)
{
enet_host_broadcast(server, 0, event.packet);
}
}
}
//ma = message all so we are going to broadcast the message to all peers
else if (tokens[0] == "ma")
{
if (tokens.size() == 2)
{
enet_host_broadcast(server, 0, event.packet);
}
}
/* One could just use enet_host_service() instead. */
enet_host_flush(server);
}
/* Clean up the packet now that we're done using it. */
enet_packet_destroy(event.packet);
break;
}
case ENET_EVENT_TYPE_NONE:
break;
default:
break;
}
}
}
}
Here is how the packet is created by the client and then sent to the server.
if (connected) {
std::cout << "Input: ";
std::string str = "";
std::getline(std::cin, str);
if (str.length() == 0) { continue; }
packet = enet_packet_create(str.c_str(), str.length() + 1, ENET_PACKET_FLAG_RELIABLE);
enet_peer_send(peer, 0, packet);
}
If code sample if not enough I can provide more.
A crash in
malloc()
usually means that someone wrote over the end of an allocated buffer some time earlier. That buffer overrun corrupted the pointers that get stored in free memory to link free blocks together. It didn't cause a problem untilmalloc()
tried to use those pointers. Then BOOM!Post the declaration of the event.packet type. Are you sure data[] is big enough for the data you put in it?