network: Fix crash in ReliablePacketBuffer on mismatching packets
authorsfan5 <sfan5@live.de>
Thu, 15 Aug 2019 15:17:17 +0000 (17:17 +0200)
committersfan5 <sfan5@live.de>
Thu, 15 Aug 2019 17:18:54 +0000 (19:18 +0200)
In the error condition the exception would be thrown before m_list_size
is decremented, causing a nullptr dereference in e.g. popFirst().

src/network/connection.cpp

index 913088da7b3da1c9a9e359ebc08400a01934eb25..3c6cc5f3f4cc952b3d81a479acea3df66796b5aa 100644 (file)
@@ -322,6 +322,10 @@ void ReliablePacketBuffer::insert(BufferedPacket &p,u16 next_expected)
        }
 
        if (s == seqnum) {
+               /* nothing to do this seems to be a resent packet */
+               /* for paranoia reason data should be compared */
+               --m_list_size;
+
                if (
                        (readU16(&(i->data[BASE_HEADER_SIZE+1])) != seqnum) ||
                        (i->data.getSize() != p.data.getSize()) ||
@@ -340,10 +344,6 @@ void ReliablePacketBuffer::insert(BufferedPacket &p,u16 next_expected)
                                        p.address.serializeString().c_str());
                        throw IncomingDataCorruption("duplicated packet isn't same as original one");
                }
-
-               /* nothing to do this seems to be a resent packet */
-               /* for paranoia reason data should be compared */
-               --m_list_size;
        }
        /* insert or push back */
        else if (i != m_list.end()) {