summaryrefslogtreecommitdiff
path: root/src/network/core/packet.cpp
diff options
context:
space:
mode:
authorRubidium <rubidium@openttd.org>2021-04-18 09:01:27 +0200
committerrubidium42 <rubidium42@users.noreply.github.com>2021-04-24 20:42:01 +0200
commitc545cc9d7039a89e23de160b1c93adc959eabda5 (patch)
tree8522a8e09c0b9fa7e3eba8b4becaef15080f5605 /src/network/core/packet.cpp
parent470d8b66372ceb5a38ce9823d451bddd2f3eca35 (diff)
downloadopenttd-c545cc9d7039a89e23de160b1c93adc959eabda5.tar.xz
Codechange: move more logic about packet size validity and reading into Packet
Diffstat (limited to 'src/network/core/packet.cpp')
-rw-r--r--src/network/core/packet.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp
index 94ffcc558..4eb0e929e 100644
--- a/src/network/core/packet.cpp
+++ b/src/network/core/packet.cpp
@@ -181,13 +181,32 @@ bool Packet::CanReadFromPacket(uint bytes_to_read)
}
/**
+ * Check whether the packet, given the position of the "write" pointer, has read
+ * enough of the packet to contain its size.
+ * @return True iff there is enough data in the packet to contain the packet's size.
+ */
+bool Packet::HasPacketSizeData() const
+{
+ return this->pos >= sizeof(PacketSize);
+}
+
+/**
* Reads the packet size from the raw packet and stores it in the packet->size
+ * @return True iff the packet size seems plausible.
*/
-void Packet::ReadRawPacketSize()
+bool Packet::ParsePacketSize()
{
assert(this->cs != nullptr && this->next == nullptr);
this->size = (PacketSize)this->buffer[0];
this->size += (PacketSize)this->buffer[1] << 8;
+
+ /* If the size of the packet is less than the bytes required for the size and type of
+ * the packet, or more than the allowed limit, then something is wrong with the packet.
+ * In those cases the packet can generally be regarded as containing garbage data. */
+ if (this->size < sizeof(PacketSize) + sizeof(PacketType) || this->size > SEND_MTU) return false;
+
+ this->pos = sizeof(PacketSize);
+ return true;
}
/**
@@ -195,8 +214,6 @@ void Packet::ReadRawPacketSize()
*/
void Packet::PrepareToRead()
{
- this->ReadRawPacketSize();
-
/* Put the position on the right place */
this->pos = sizeof(PacketSize);
}