Coverage Report

Created: 2025-07-12 06:36

/src/libdwarf/fuzz/fuzz_aranges.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright 2021 Google LLC
2
Licensed under the Apache License, Version 2.0 (the "License");
3
you may not use this file except in compliance with the License.
4
You may obtain a copy of the License at
5
      http://www.apache.org/licenses/LICENSE-2.0
6
Unless required by applicable law or agreed to in writing, software
7
distributed under the License is distributed on an "AS IS" BASIS,
8
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
See the License for the specific language governing permissions and
10
limitations under the License.
11
*/
12
#include <fcntl.h> /* open() O_RDONLY O_BINARY */
13
#include <stdint.h>
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <string.h>
17
#include <sys/types.h>
18
#include <unistd.h>
19
20
#ifndef O_BINARY
21
28.4k
#define O_BINARY 0 /* So it does nothing in Linux/Unix */
22
#endif
23
24
/*
25
 * Libdwarf library callers can only use these headers.
26
 */
27
#include "dwarf.h"
28
#include "libdwarf.h"
29
30
/*
31
 * Helper function definitions.
32
 */
33
static void cleanup_bad_arange(Dwarf_Debug dbg, Dwarf_Arange *arange,
34
                               Dwarf_Signed i, Dwarf_Signed count);
35
int arange_processing_example(Dwarf_Debug dbg, Dwarf_Error *error);
36
37
/*
38
 * Fuzzer function
39
 */
40
28.4k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
41
28.4k
  char filename[256];
42
28.4k
  sprintf(filename, "/tmp/libfuzzer.%d", getpid());
43
44
28.4k
  FILE *fp = fopen(filename, "wb");
45
28.4k
  if (!fp) {
46
0
    return 0;
47
0
  }
48
28.4k
  fwrite(data, size, 1, fp);
49
28.4k
  fclose(fp);
50
51
28.4k
  Dwarf_Debug dbg = 0;
52
28.4k
  int res = DW_DLV_ERROR;
53
28.4k
  Dwarf_Error error = 0;
54
28.4k
  Dwarf_Handler errhand = 0;
55
28.4k
  Dwarf_Ptr errarg = 0;
56
57
28.4k
  int fd = open(filename, O_RDONLY | O_BINARY);
58
28.4k
  if (fd < 0) {
59
0
    exit(EXIT_FAILURE);
60
0
  }
61
62
28.4k
  res = dwarf_init_b(fd, DW_GROUPNUMBER_ANY, errhand, errarg, &dbg, &error);
63
64
28.4k
  if (res != DW_DLV_OK) {
65
22.7k
    dwarf_dealloc_error(dbg, error);
66
22.7k
  } else {
67
    /*  Adding newline avoids a warning from diff
68
        in regressiontesting */
69
5.72k
    printf("Processing\n");
70
5.72k
    arange_processing_example(dbg, &error);
71
5.72k
  }
72
73
28.4k
  dwarf_finish(dbg);
74
28.4k
  close(fd);
75
28.4k
  unlink(filename);
76
28.4k
  return 0;
77
28.4k
}
78
79
static void cleanup_bad_arange(Dwarf_Debug dbg, Dwarf_Arange *arange,
80
205
                               Dwarf_Signed i, Dwarf_Signed count) {
81
205
  Dwarf_Signed k = i;
82
43.5k
  for (; k < count; ++k) {
83
43.3k
    dwarf_dealloc(dbg, arange[k], DW_DLA_ARANGE);
84
43.3k
    arange[k] = 0;
85
43.3k
  }
86
205
}
87
88
// Source:
89
// https://www.prevanders.net/libdwarfdoc/group__aranges.html#ga9b628e21a71f4280f93788815796ef92
90
1.76k
int arange_processing_example(Dwarf_Debug dbg, Dwarf_Error *error) {
91
1.76k
  Dwarf_Signed count = 0;
92
1.76k
  Dwarf_Arange *arange = 0;
93
1.76k
  int res = 0;
94
95
1.76k
  res = dwarf_get_aranges(dbg, &arange, &count, error);
96
1.76k
  if (res == DW_DLV_OK) {
97
306
    Dwarf_Signed i = 0;
98
99
111k
    for (i = 0; i < count; ++i) {
100
111k
      Dwarf_Arange ara = arange[i];
101
111k
      Dwarf_Unsigned segment = 0;
102
111k
      Dwarf_Unsigned segment_entry_size = 0;
103
111k
      Dwarf_Addr start = 0;
104
111k
      Dwarf_Unsigned length = 0;
105
111k
      Dwarf_Off cu_die_offset = 0;
106
107
111k
      res = dwarf_get_arange_info_b(ara, &segment, &segment_entry_size, &start,
108
111k
                                    &length, &cu_die_offset, error);
109
111k
      if (res != DW_DLV_OK) {
110
205
        cleanup_bad_arange(dbg, arange, i, count);
111
205
        dwarf_dealloc(dbg, arange, DW_DLA_LIST);
112
205
        return res;
113
205
      }
114
111k
      dwarf_dealloc(dbg, ara, DW_DLA_ARANGE);
115
111k
      arange[i] = 0;
116
111k
    }
117
101
    dwarf_dealloc(dbg, arange, DW_DLA_LIST);
118
101
  }
119
1.55k
  return res;
120
1.76k
}