Server crashed when client sent message that cannot be serialized. I think it should be compatible with this dirty data. Reading stream was broke exceptionally caused by the wrong numMessages. I've been reading your code for a week, and I'm trying to fix it. It works. Did I mess it up? This is my backtrace and modification.
(gdb) bt
#0 0x00007f6664949625 in raise () from /lib64/libc.so.6
#1 0x00007f666494ae05 in abort () from /lib64/libc.so.6
#2 0x00007f666494274e in __assert_fail_base () from /lib64/libc.so.6
#3 0x00007f6664942810 in __assert_fail () from /lib64/libc.so.6
#4 0x00000000004214b5 in yojimbo::ChannelPacketData::Free (this=0x226c220, messageFactory=...) at yojimbo_channel.cpp:39
#5 0x0000000000417e5b in yojimbo::ConnectionPacket::~ConnectionPacket (this=0x226c2b0, __in_chrg=) at yojimbo_connection.cpp:45
#6 0x000000000041c494 in yojimbo::PacketFactory::DestroyPacket (this=0x1d24200, packet=0x226c2b0) at yojimbo_packet.cpp:309
#7 0x000000000041b7d5 in yojimbo::Packet::Destroy (this=0x226c2b0) at yojimbo_packet.cpp:40
#8 0x000000000041c0a6 in yojimbo::ReadPacket (info=..., buffer=0x7fff34e07d00 "", bufferSize=93, errorCode=0x7fff34e07c98) at yojimbo_packet.cpp:239
#9 0x000000000042b284 in yojimbo::PacketProcessor::ReadPacket (this=0x1d22080, packetData=0x7fff34e07d00 "", sequence=@0x7fff34e08d50, packetBytes=93,
encrypted=@0x7fff34e08d5f, key=0x0, encryptedPacketTypes=0x1d24120 "\001\001\001\001\001\001\001\001",
unencryptedPacketTypes=0x1d24120 "\001\001\001\001\001\001\001\001", streamAllocator=..., packetFactory=...) at yojimbo_packet_processor.cpp:237
#10 0x000000000041e9d0 in yojimbo::BaseTransport::ReadPackets (this=0x7fff34e08df0) at yojimbo_transport.cpp:367
#11 0x0000000000401c9b in ServerMain () at tests/server.cpp:145
#12 0x0000000000401e22 in main () at tests/server.cpp:181
template bool SerializeOrderedMessages( Stream & stream, MessageFactory & messageFactory, int & numMessages, Message ** & messages, int maxMessagesPerPacket )
{
const int maxMessageType = messageFactory.GetNumTypes() - 1;
bool hasMessages = Stream::IsWriting && numMessages != 0;
serialize_bool( stream, hasMessages );
if ( hasMessages )
{
serialize_int( stream, numMessages, 1, maxMessagesPerPacket );
int * messageTypes = (int*) alloca( sizeof( int ) * numMessages );
uint16_t * messageIds = (uint16_t*) alloca( sizeof( uint16_t ) * numMessages );
memset( messageTypes, 0, sizeof( int ) * numMessages );
memset( messageIds, 0, sizeof( uint16_t ) * numMessages );
if ( Stream::IsWriting )
{
assert( messages );
for ( int i = 0; i < numMessages; ++i )
{
assert( messages[i] );
messageTypes[i] = messages[i]->GetType();
messageIds[i] = messages[i]->GetId();
}
}
else
{
Allocator & allocator = messageFactory.GetAllocator();
messages = (Message**) allocator.Allocate( sizeof( Message* ) * numMessages );
}
serialize_bits( stream, messageIds[0], 16 );
for ( int i = 1; i < numMessages; ++i )
serialize_sequence_relative( stream, messageIds[i-1], messageIds[i] );
for ( int i = 0; i < numMessages; ++i )
{
if ( maxMessageType > 0 )
{
serialize_int( stream, messageTypes[i], 0, maxMessageType );
}
else
{
messageTypes[i] = 0;
}
if ( Stream::IsReading )
{
messages[i] = messageFactory.Create( messageTypes[i] );
if ( !messages[i] )
return false;
messages[i]->AssignId( messageIds[i] );
}
assert( messages[i] );
if ( !messages[i]->SerializeInternal( stream ) )
{
numMessages = i+1; // fix processed messages amount
return false;
}
}
}
return true;
}
Thank you for your great job. It's helpful. I will continue to pay attention to.