Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46f2a822 authored by Christopher Ferris's avatar Christopher Ferris Committed by Automerger Merge Worker
Browse files

Merge "Fix fuzzer so it doesn't add overlapping maps." am: a39e39fe

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1387875

Change-Id: Ib671925c2226490e586ec152a2d6c1f38005b2ba
parents a0c115a3 a39e39fe
Loading
Loading
Loading
Loading
+23 −3
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

#include "UnwinderComponentCreator.h"

#include <map>
#include <memory>
#include <string>
#include <vector>

std::unique_ptr<Regs> 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<Maps> GetMaps(FuzzedDataProvider* data_provider) {
  std::unique_ptr<Maps> maps = std::make_unique<Maps>();
  std::map<uint64_t, uint64_t> map_ends;
  uint8_t entry_count = data_provider->ConsumeIntegralInRange<uint8_t>(0, kMaxMapEntryCount);
  for (uint8_t i = 0; i < entry_count; i++) {
    uint64_t start = data_provider->ConsumeIntegral<uint64_t>();
    uint64_t end = data_provider->ConsumeIntegralInRange<uint64_t>(start, UINT64_MAX);
    uint64_t offset = data_provider->ConsumeIntegral<uint64_t>();
    uint64_t start = AlignToPage(data_provider->ConsumeIntegral<uint64_t>());
    uint64_t end = AlignToPage(data_provider->ConsumeIntegralInRange<uint64_t>(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<uint64_t>());
    std::string map_info_name = data_provider->ConsumeRandomLengthString(kMaxMapInfoNameLen);
    uint8_t flags = PROT_READ | PROT_WRITE;