Create PacketError exception and use it with ACTIVEOBJECT_REMOVE_ADD handler which can be unreliable

This commit is contained in:
Loic Blot 2015-04-03 08:53:31 +02:00
parent 92f20696eb
commit aa340fd857
3 changed files with 24 additions and 15 deletions

View File

@ -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) {}

View File

@ -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;
}
}

View File

@ -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());
}
}