aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Blot <loic.blot@unix-experience.fr>2015-04-03 08:53:31 +0200
committerLoic Blot <loic.blot@unix-experience.fr>2015-04-03 08:53:31 +0200
commitaa340fd857c151384873f2b29a9bad76e49e852a (patch)
tree60524b27c50de5e8a491c2a4bca941459bba7e71
parent92f20696eb57701d4d59adb5e9278315c2558180 (diff)
downloadminetest-aa340fd857c151384873f2b29a9bad76e49e852a.tar.gz
minetest-aa340fd857c151384873f2b29a9bad76e49e852a.tar.bz2
minetest-aa340fd857c151384873f2b29a9bad76e49e852a.zip
Create PacketError exception and use it with ACTIVEOBJECT_REMOVE_ADD handler which can be unreliable
-rw-r--r--src/exceptions.h5
-rw-r--r--src/network/clientpackethandler.cpp32
-rw-r--r--src/network/networkpacket.cpp2
3 files changed, 24 insertions, 15 deletions
diff --git a/src/exceptions.h b/src/exceptions.h
index 5b716c2ca..0ea4c9350 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -70,6 +70,11 @@ public:
SerializationError(const std::string &s): BaseException(s) {}
};
+class PacketError : public BaseException {
+public:
+ PacketError(const std::string &s): BaseException(s) {}
+};
+
class LoadError : public BaseException {
public:
LoadError(const std::string &s): BaseException(s) {}
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 4afe2a2ce..a9096accc 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -336,7 +336,6 @@ void Client::handleCommand_ChatMessage(NetworkPacket* pkt)
void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
{
/*
- u16 command
u16 count of removed objects
for all removed objects {
u16 id
@@ -350,23 +349,28 @@ void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt)
}
*/
- // Read removed objects
- u8 type;
- u16 removed_count, added_count, id;
+ try {
+ u8 type;
+ u16 removed_count, added_count, id;
- *pkt >> removed_count;
+ // Read removed objects
+ *pkt >> removed_count;
- for (u16 i = 0; i < removed_count; i++) {
- *pkt >> id;
- m_env.removeActiveObject(id);
- }
+ for (u16 i = 0; i < removed_count; i++) {
+ *pkt >> id;
+ m_env.removeActiveObject(id);
+ }
- // Read added objects
- *pkt >> added_count;
+ // Read added objects
+ *pkt >> added_count;
- for (u16 i = 0; i < added_count; i++) {
- *pkt >> id >> type;
- m_env.addActiveObject(id, type, pkt->readLongString());
+ for (u16 i = 0; i < added_count; i++) {
+ *pkt >> id >> type;
+ m_env.addActiveObject(id, type, pkt->readLongString());
+ }
+ } catch (PacketError &e) {
+ infostream << "handleCommand_ActiveObjectRemoveAdd: " << e.what()
+ << ". The packet is unreliable, ignoring" << std::endl;
}
}
diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp
index 95605d410..a4a481db4 100644
--- a/src/network/networkpacket.cpp
+++ b/src/network/networkpacket.cpp
@@ -45,7 +45,7 @@ void NetworkPacket::checkReadOffset(u32 from_offset)
std::stringstream ss;
ss << "Reading outside packet (offset: " <<
from_offset << ", packet size: " << getSize() << ")";
- throw SerializationError(ss.str());
+ throw PacketError(ss.str());
}
}