42 lines
1.2 KiB
C++
42 lines
1.2 KiB
C++
#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;
|
|
} |