#include #include #include #include #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; }