1 #include <assert.h>
2 #include <stdint.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include "libfdt.h"
7 #include "libfdt_env.h"
8
walk_device_tree(const void * device_tree,int parent_node)9 void walk_device_tree(const void *device_tree, int parent_node) {
10 int len = 0;
11 const char *node_name = fdt_get_name(device_tree, parent_node, &len);
12 if (node_name != NULL) {
13 // avoid clang complaining about unused variable node_name and force
14 // ASan to validate string pointer in strlen call.
15 assert(strlen(node_name) == len);
16 }
17
18 uint32_t phandle = fdt_get_phandle(device_tree, parent_node);
19 if (phandle != 0) {
20 assert(parent_node == fdt_node_offset_by_phandle(device_tree, phandle));
21 }
22
23 // recursively walk the node's children
24 for (int node = fdt_first_subnode(device_tree, parent_node); node >= 0;
25 node = fdt_next_subnode(device_tree, node)) {
26 walk_device_tree(device_tree, node);
27 }
28 }
29
30 // Information on device tree is available in external/dtc/Documentation/
31 // folder.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)32 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
33 // Non-zero return values are reserved for future use.
34 if (size < FDT_V17_SIZE) return 0;
35
36 if (fdt_check_header(data) != 0) return 0;
37
38 int root_node_offset = 0;
39 walk_device_tree(data, root_node_offset);
40
41 return 0;
42 }