From 89c6aae53a39193454eee4d049d332a91f2306f0 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Sun, 19 May 2024 20:08:27 -0700 Subject: [PATCH] Fix bugs found through fuzzing --- Facade.h | 12 ++++++------ VersionedMap.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Facade.h b/Facade.h index b13b8e1..02b4bdb 100644 --- a/Facade.h +++ b/Facade.h @@ -29,12 +29,6 @@ struct Facade { const int64_t v[] = {version, version}; facade->versioned.firstGeq(key, v, versionedIter, 2); - if (versionedIter[0] == versionedIter[1]) { - // No mutations intersect [begin, end) - facade->unversionedRead(begin, end, limit, reverse, result); - return result; - } - // Make sure versionedIter[1] param1 is >= `end` if (versionedIter[1] != facade->versioned.end(version)) { auto m = *versionedIter[1]; @@ -43,6 +37,12 @@ struct Facade { } } + if (versionedIter[0] == versionedIter[1]) { + // No mutations intersect [begin, end) + facade->unversionedRead(begin, end, limit, reverse, result); + return result; + } + static const uint8_t zero_[] = {0}; static const String zero{zero_, 1}; diff --git a/VersionedMap.cpp b/VersionedMap.cpp index 25eae08..fb2132f 100644 --- a/VersionedMap.cpp +++ b/VersionedMap.cpp @@ -653,7 +653,14 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl { rangeVersion = latestVersion; if (inserted) { val = {nullptr, -1}; // Sentinel for "no point mutation here" - pointVersion = -1; // Sentinel for "no point mutation here" + Finger copy; + finger.copyTo(copy); + move(copy, latestVersion, true); + if (copy.searchPathSize() == 0) { + pointVersion = -1; // Sentinel for "no mutation ending here" + } else { + pointVersion = mm.base[copy.backNode()].entry->rangeVersion; + } } else { auto *entry = mm.base[finger.backNode()].entry; val = {entry->getVal(), entry->valLen};