From ce57b5d156ac0ca81e86dc961b39d229fedba434 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 28 Jun 2007 13:01:40 +0200 Subject: [PATCH] more asserts, add failing tests, fix them --- src/common/packet-metadata.cc | 42 ++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/common/packet-metadata.cc b/src/common/packet-metadata.cc index b70f65fca..52ff5bcd3 100644 --- a/src/common/packet-metadata.cc +++ b/src/common/packet-metadata.cc @@ -370,6 +370,7 @@ PacketMetadata::UpdateTail (uint16_t written) } NS_ASSERT (m_tail != 0xffff); NS_ASSERT (m_head != 0xffff); + NS_ASSERT (written >= 8); m_used += written; m_data->m_dirtyEnd = m_used; } @@ -395,6 +396,7 @@ PacketMetadata::UpdateHead (uint16_t written) } NS_ASSERT (m_tail != 0xffff); NS_ASSERT (m_head != 0xffff); + NS_ASSERT (written >= 8); m_used += written; m_data->m_dirtyEnd = m_used; } @@ -698,7 +700,7 @@ PacketMetadata::DoRemoveHeader (uint32_t uid, uint32_t size) } struct PacketMetadata::SmallItem item; struct PacketMetadata::ExtraItem extraItem; - ReadItems (m_head, &item, &extraItem); + uint32_t read = ReadItems (m_head, &item, &extraItem); if ((item.typeUid & 0xfffffffe) != uid || item.size != size) { @@ -710,11 +712,19 @@ PacketMetadata::DoRemoveHeader (uint32_t uid, uint32_t size) { NS_FATAL_ERROR ("Removing incomplete header."); } - m_head = item.next; - if (m_head > m_tail) + if (m_head + read == m_used) { m_used = m_head; } + if (item.next == 0xffff) + { + m_head = 0xffff; + m_tail = 0xffff; + } + else + { + m_head = item.next; + } } void PacketMetadata::DoAddTrailer (uint32_t uid, uint32_t size) @@ -742,7 +752,7 @@ PacketMetadata::DoRemoveTrailer (uint32_t uid, uint32_t size) } struct PacketMetadata::SmallItem item; struct PacketMetadata::ExtraItem extraItem; - ReadItems (m_tail, &item, &extraItem); + uint32_t read = ReadItems (m_tail, &item, &extraItem); if ((item.typeUid & 0xfffffffe) != uid || item.size != size) { @@ -754,10 +764,18 @@ PacketMetadata::DoRemoveTrailer (uint32_t uid, uint32_t size) { NS_FATAL_ERROR ("Removing incomplete trailer."); } - m_tail = item.prev; - if (m_tail > m_head) + if (m_tail + read == m_used) { m_used = m_tail; + } + if (item.prev == 0xffff) + { + m_head = 0xffff; + m_tail = 0xffff; + } + else + { + m_tail = item.prev; } } void @@ -1655,6 +1673,18 @@ PacketMetadataTest::RunTests (void) p1.AddAtEnd (p2); CHECK_HISTORY (p, 2, 5, 10); + p = Packet (); + ADD_TRAILER (p, 10); + REM_TRAILER (p, 10); + ADD_TRAILER (p, 10); + CHECK_HISTORY (p, 1, 10); + + p = Packet (); + ADD_HEADER (p, 10); + REM_HEADER (p, 10); + ADD_HEADER (p, 10); + CHECK_HISTORY (p, 1, 10); + return ok; }