libcros 0.5.2

A Rust library that provides easy-to-use functions for interacting with a Chrome device
Documentation
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stddef.h>
#include <stdint.h>

#include <vector>

#include "base/check.h"
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"

#include "vpd/cache.h"
#include "vpd/fake_fmap.h"
#include "vpd/flashrom.h"
#include "vpd/sysfs.h"
#include "vpd/types.h"

namespace vpd {

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  // Turn off logging.
  logging::SetMinLogLevel(logging::LOGGING_FATAL);

  base::ScopedTempDir temp_dir;
  CHECK(temp_dir.CreateUniqueTempDir());

  unsigned int flash_size = 16 * 1024 * 1024;
  base::FilePath flash_path(temp_dir.GetPath().Append("flash.bin"));

  // Create a file-backed "flash", with an FMAP.
  FakeFmap::FillFlashFile(flash_path, flash_size, false /* empty fmap */);

  // Fill the RO_VPD region of that "flash" with fuzzed data.
  Flashrom flashrom("dummy",
                    FakeFmap::GetProgrammerParams(flash_path, flash_size));
  flashrom.Write(VpdRo, std::vector<uint8_t>(data, data + size));

  // Fake sysfs.
  Sysfs sysfs(temp_dir.GetPath().value());

  // Fire away!
  Cache cache(flash_path.value(), flash_size, temp_dir.GetPath().value(),
              sysfs);
  auto dict = cache.GetValues(VpdRo);

  // A valid dict is all we're looking for.

  return 0;
}

}  // namespace vpd