Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Remove raw message output on AOM deserialization failure
Improve TOCLIENT_ACTIVE_OBJECT_MESSAGES robustness for handling invalid data
  • Loading branch information
kwolekr committed Jul 14, 2015
1 parent 6f07f79 commit 5006ce8
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 36 deletions.
29 changes: 12 additions & 17 deletions src/environment.cpp
Expand Up @@ -2535,28 +2535,23 @@ void ClientEnvironment::removeActiveObject(u16 id)
m_active_objects.erase(id);
}

void ClientEnvironment::processActiveObjectMessage(u16 id,
const std::string &data)
void ClientEnvironment::processActiveObjectMessage(u16 id, const std::string &data)
{
ClientActiveObject* obj = getActiveObject(id);
if(obj == NULL)
{
infostream<<"ClientEnvironment::processActiveObjectMessage():"
<<" got message for id="<<id<<", which doesn't exist."
<<std::endl;
ClientActiveObject *obj = getActiveObject(id);
if (obj == NULL) {
infostream << "ClientEnvironment::processActiveObjectMessage():"
<< " got message for id=" << id << ", which doesn't exist."
<< std::endl;
return;
}
try
{

try {
obj->processMessage(data);
}
catch(SerializationError &e)
{
} catch (SerializationError &e) {
errorstream<<"ClientEnvironment::processActiveObjectMessage():"
<<" id="<<id<<" type="<<obj->getType()
<<" SerializationError in processMessage(),"
<<" message="<<serializeJsonString(data)
<<std::endl;
<< " id=" << id << " type=" << obj->getType()
<< " SerializationError in processMessage(): " << e.what()
<< std::endl;
}
}

Expand Down
28 changes: 9 additions & 19 deletions src/network/clientpackethandler.cpp
Expand Up @@ -449,33 +449,23 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
string message
}
*/
char buf[6];
// Get all data except the command number
std::string datastring(pkt->getString(0), pkt->getSize());
// Throw them in an istringstream
std::istringstream is(datastring, std::ios_base::binary);

try {
while(is.eof() == false) {
is.read(buf, 2);
u16 id = readU16((u8*)buf);
if (is.eof())
while (is.good()) {
u16 id = readU16(is);
if (!is.good())
break;
is.read(buf, 2);
size_t message_size = readU16((u8*)buf);
std::string message;
message.reserve(message_size);
for (u32 i = 0; i < message_size; i++) {
is.read(buf, 1);
message.append(buf, 1);
}

std::string message = deSerializeString(is);

// Pass on to the environment
m_env.processActiveObjectMessage(id, message);
}
// Packet could be unreliable then ignore it
} catch (PacketError &e) {
infostream << "handleCommand_ActiveObjectMessages: " << e.what()
<< ". The packet is unreliable, ignoring" << std::endl;
} catch (SerializationError &e) {
errorstream << "Client::handleCommand_ActiveObjectMessages: "
<< "caught SerializationError: " << e.what() << std::endl;
}
}

Expand Down

0 comments on commit 5006ce8

Please sign in to comment.