From 5006ce82609b2260f191b132f2dabcfdb06d6e20 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Mon, 13 Jul 2015 23:29:29 -0400 Subject: Remove raw message output on AOM deserialization failure Improve TOCLIENT_ACTIVE_OBJECT_MESSAGES robustness for handling invalid data --- src/environment.cpp | 29 ++++++++++++----------------- src/network/clientpackethandler.cpp | 28 +++++++++------------------- 2 files changed, 21 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/environment.cpp b/src/environment.cpp index 09db886a8..5affda6fa 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -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="<processMessage(data); - } - catch(SerializationError &e) - { + } catch (SerializationError &e) { errorstream<<"ClientEnvironment::processActiveObjectMessage():" - <<" id="<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; } } -- cgit v1.2.3