From 605d8c871579633f6b2e266798c18fa7a44311cb Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Sun, 21 Jan 2024 14:30:40 -0800 Subject: [PATCH] Allow variable length keys in fuzz test --- ConflictSet.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 83fb0c2..2fd148e 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1251,15 +1251,22 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int numWrites = gArbitrary.bounded(10); int64_t v = ++writeVersion; auto *writes = new (arena) ConflictSet::WriteRange[numWrites]; - std::set, ArenaAlloc> keys{ + std::set, ArenaAlloc> keys{ ArenaAlloc(&arena)}; while (int(keys.size()) < numWrites) { - keys.insert(gArbitrary.hasEntropy() ? gArbitrary.bounded(100) - : rand.bounded(100)); + if (!gArbitrary.hasEntropy()) { + // Tell the fuzzer it's not interesting + return -1; + } + int keyLen = gArbitrary.bounded(8); + auto* begin = new (arena) uint8_t[keyLen]; + gArbitrary.randomHex(begin, keyLen); + keys.insert(std::string_view((const char*)begin, keyLen)); } auto iter = keys.begin(); for (int i = 0; i < numWrites; ++i) { - writes[i].begin = toKey(arena, *iter++); + writes[i].begin.p = (const uint8_t*)iter->data(); + writes[i].begin.len = iter->size(); writes[i].end.len = 0; writes[i].writeVersion = v; } @@ -1274,15 +1281,22 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { int numReads = gArbitrary.bounded(10); int64_t v = writeVersion - gArbitrary.bounded(10); auto *reads = new (arena) ConflictSet::ReadRange[numReads]; - std::set, ArenaAlloc> keys{ + std::set, ArenaAlloc> keys{ ArenaAlloc(&arena)}; while (int(keys.size()) < numReads) { - keys.insert(gArbitrary.hasEntropy() ? gArbitrary.bounded(100) - : rand.bounded(100)); + if (!gArbitrary.hasEntropy()) { + // Tell the fuzzer it's not interesting + return -1; + } + int keyLen = gArbitrary.bounded(8); + auto* begin = new (arena) uint8_t[keyLen]; + gArbitrary.randomHex(begin, keyLen); + keys.insert(std::string_view((const char*)begin, keyLen)); } auto iter = keys.begin(); for (int i = 0; i < numReads; ++i) { - reads[i].begin = toKey(arena, *iter++); + reads[i].begin.p = (const uint8_t*)iter->data(); + reads[i].begin.len = iter->size(); reads[i].end.len = 0; reads[i].readVersion = v; }