diff options
author | kwolekr <kwolekr@minetest.net> | 2015-07-13 23:29:29 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-07-13 23:29:29 -0400 |
commit | 5006ce82609b2260f191b132f2dabcfdb06d6e20 (patch) | |
tree | 37dff0c7114047e67571bc8f853df7257b957be9 | |
parent | 6f07f79c2f36b007b4c0385b7df2fc4612af7aba (diff) | |
download | minetest-5006ce82609b2260f191b132f2dabcfdb06d6e20.tar.gz minetest-5006ce82609b2260f191b132f2dabcfdb06d6e20.tar.bz2 minetest-5006ce82609b2260f191b132f2dabcfdb06d6e20.zip |
Remove raw message output on AOM deserialization failure
Improve TOCLIENT_ACTIVE_OBJECT_MESSAGES robustness for handling invalid data
-rw-r--r-- | src/environment.cpp | 29 | ||||
-rw-r--r-- | src/network/clientpackethandler.cpp | 28 |
2 files changed, 21 insertions, 36 deletions
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="<<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; } } diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 4cebb2184..15d5456fa 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -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; } } |