• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }