From 8c67f4d723529f8d12e0c05dab8bf0910054a2dc Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 18 Jul 2019 20:31:51 -0500 Subject: [PATCH] [ox/ptrarith] Fix NodeBuffer::compact to correclty update dest.prev (synced from d55089b582c6398f826f34a829533e648b223cde) --- src/ox/ptrarith/nodebuffer.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ox/ptrarith/nodebuffer.hpp b/src/ox/ptrarith/nodebuffer.hpp index 5a795e6a3..798797f60 100644 --- a/src/ox/ptrarith/nodebuffer.hpp +++ b/src/ox/ptrarith/nodebuffer.hpp @@ -278,6 +278,7 @@ typename NodeBuffer::ItemPtr NodeBuffer::malloc(size m_header.bytesUsed += out.size(); } else { oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "Unknown"; + return nullptr; } oxTrace("ox::ptrarith::NodeBuffer::malloc") << "Offset:" << out.offset(); return out; @@ -293,8 +294,8 @@ Error NodeBuffer::free(ItemPtr item) { auto next = this->next(item); if (prev.valid() && next.valid()) { if (next != item) { - prev->next = next.offset(); - next->prev = prev.offset(); + prev->next = next; + next->prev = prev; if (item.offset() == m_header.firstItem) { m_header.firstItem = next; } @@ -319,8 +320,11 @@ Error NodeBuffer::free(ItemPtr item) { template Error NodeBuffer::setSize(size_t size) { + oxTrace("ox::ptrarith::NodeBuffer::setSize") << size; auto last = lastItem(); - if ((last.valid() && last.end() >= size) || size < sizeof(m_header)) { + auto end = last.valid() ? last.end() : sizeof(m_header); + oxTrace("ox::ptrarith::NodeBuffer::setSize") << "end:" << end; + if (end > size) { return OxError(1); } else { m_header.size = size; @@ -358,7 +362,7 @@ void NodeBuffer::compact(F cb) { ox_memcpy(dest, src, src.size()); cb(src, dest); // update surrounding nodes - auto prev = ptr(dest->next); + auto prev = ptr(dest->prev); if (prev.valid()) { prev->next = dest; }