diff --git a/libunwindstack/tests/fuzz/UnwinderComponentCreator.cpp b/libunwindstack/tests/fuzz/UnwinderComponentCreator.cpp index 94f5a73cd..0415ef684 100644 --- a/libunwindstack/tests/fuzz/UnwinderComponentCreator.cpp +++ b/libunwindstack/tests/fuzz/UnwinderComponentCreator.cpp @@ -16,6 +16,11 @@ #include "UnwinderComponentCreator.h" +#include +#include +#include +#include + std::unique_ptr GetRegisters(ArchEnum arch) { switch (arch) { case unwindstack::ARCH_ARM: { @@ -109,13 +114,28 @@ ElfFake* PopulateElfFake(FuzzedDataProvider* data_provider) { return elf; } +static constexpr size_t kPageSize = 4096; + +static constexpr uint64_t AlignToPage(uint64_t address) { + return (address + kPageSize - 1) & ~(kPageSize - 1); +} + std::unique_ptr GetMaps(FuzzedDataProvider* data_provider) { std::unique_ptr maps = std::make_unique(); + std::map map_ends; uint8_t entry_count = data_provider->ConsumeIntegralInRange(0, kMaxMapEntryCount); for (uint8_t i = 0; i < entry_count; i++) { - uint64_t start = data_provider->ConsumeIntegral(); - uint64_t end = data_provider->ConsumeIntegralInRange(start, UINT64_MAX); - uint64_t offset = data_provider->ConsumeIntegral(); + uint64_t start = AlignToPage(data_provider->ConsumeIntegral()); + uint64_t end = AlignToPage(data_provider->ConsumeIntegralInRange(start, UINT64_MAX)); + // Make sure not to add overlapping maps, that is not something that can + // happen in the real world. + auto entry = map_ends.upper_bound(start); + if (entry != map_ends.end() && end > entry->second) { + continue; + } + map_ends[end] = start; + + uint64_t offset = AlignToPage(data_provider->ConsumeIntegral()); std::string map_info_name = data_provider->ConsumeRandomLengthString(kMaxMapInfoNameLen); uint8_t flags = PROT_READ | PROT_WRITE;