Create an initial version of libfdt fuzzer. am: 49a2e71ae0
Original change: https://android-review.googlesource.com/c/platform/external/dtc/+/1987187 Change-Id: Ibc4f2ae2010ae295be48e179970a9fa9de3f4eaa
This commit is contained in:
commit
85189c3a6a
2 changed files with 57 additions and 0 deletions
15
fuzzing/Android.bp
Normal file
15
fuzzing/Android.bp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2022 The Android Open Source Project
|
||||||
|
package {
|
||||||
|
default_applicable_licenses: ["external_dtc_license"],
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_fuzz {
|
||||||
|
name: "libfdt_fuzzer",
|
||||||
|
srcs: [
|
||||||
|
"libfdt_fuzzer.cpp",
|
||||||
|
],
|
||||||
|
static_libs: [
|
||||||
|
"libfdt",
|
||||||
|
],
|
||||||
|
host_supported: true,
|
||||||
|
}
|
42
fuzzing/libfdt_fuzzer.cpp
Normal file
42
fuzzing/libfdt_fuzzer.cpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "libfdt.h"
|
||||||
|
#include "libfdt_env.h"
|
||||||
|
|
||||||
|
void walk_device_tree(const void *device_tree, int parent_node) {
|
||||||
|
int len = 0;
|
||||||
|
const char *node_name = fdt_get_name(device_tree, parent_node, &len);
|
||||||
|
if (node_name != NULL) {
|
||||||
|
// avoid clang complaining about unused variable node_name and force
|
||||||
|
// ASan to validate string pointer in strlen call.
|
||||||
|
assert(strlen(node_name) == len);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t phandle = fdt_get_phandle(device_tree, parent_node);
|
||||||
|
if (phandle != 0) {
|
||||||
|
assert(parent_node == fdt_node_offset_by_phandle(device_tree, phandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
// recursively walk the node's children
|
||||||
|
for (int node = fdt_first_subnode(device_tree, parent_node); node >= 0;
|
||||||
|
node = fdt_next_subnode(device_tree, node)) {
|
||||||
|
walk_device_tree(device_tree, node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Information on device tree is available in external/dtc/Documentation/
|
||||||
|
// folder.
|
||||||
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||||
|
// Non-zero return values are reserved for future use.
|
||||||
|
if (size < FDT_V17_SIZE) return 0;
|
||||||
|
|
||||||
|
if (fdt_check_header(data) != 0) return 0;
|
||||||
|
|
||||||
|
int root_node_offset = 0;
|
||||||
|
walk_device_tree(data, root_node_offset);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue