Coverage Report

Created: 2025-08-26 06:24

/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
9.29k
#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
9.29k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
41
9.29k
  char filename[256];
42
#ifdef DWREGRESSIONTEMP
43
  /* Under msys2, the /tmp/ results in an open fail */
44
  sprintf(filename, "junklibfuzzer.%d", getpid());
45
#else
46
9.29k
  sprintf(filename, "/tmp/libfuzzer.%d", getpid());
47
9.29k
#endif
48
49
9.29k
  FILE *fp = fopen(filename, "wb");
50
9.29k
  if (!fp) {
51
0
    printf("FAIL libfuzzer cannot open temp as writeable %s\n",
52
0
        filename);
53
0
    return 0;
54
0
  }
55
9.29k
  fwrite(data, size, 1, fp);
56
9.29k
  fclose(fp);
57
58
9.29k
  Dwarf_Debug dbg = 0;
59
9.29k
  int res = DW_DLV_ERROR;
60
9.29k
  Dwarf_Error error = 0;
61
9.29k
  Dwarf_Handler errhand = 0;
62
9.29k
  Dwarf_Ptr errarg = 0;
63
64
9.29k
  int fd = open(filename, O_RDONLY | O_BINARY);
65
9.29k
  if (fd < 0) {
66
0
    exit(EXIT_FAILURE);
67
0
  }
68
69
9.29k
  res = dwarf_init_b(fd, DW_GROUPNUMBER_ANY, errhand, errarg, &dbg, &error);
70
71
9.29k
  if (res != DW_DLV_OK) {
72
7.59k
    dwarf_dealloc_error(dbg, error);
73
7.59k
  } else {
74
    /*  Adding newline avoids a warning from diff
75
        in regressiontesting */
76
1.69k
    printf("Processing\n");
77
1.69k
    arange_processing_example(dbg, &error);
78
1.69k
  }
79
80
9.29k
  dwarf_finish(dbg);
81
9.29k
  close(fd);
82
9.29k
  unlink(filename);
83
9.29k
  return 0;
84
9.29k
}
85
86
static void cleanup_bad_arange(Dwarf_Debug dbg, Dwarf_Arange *arange,
87
145
                               Dwarf_Signed i, Dwarf_Signed count) {
88
145
  Dwarf_Signed k = i;
89
133k
  for (; k < count; ++k) {
90
133k
    dwarf_dealloc(dbg, arange[k], DW_DLA_ARANGE);
91
133k
    arange[k] = 0;
92
133k
  }
93
145
}
94
95
// Source:
96
// https://www.prevanders.net/libdwarfdoc/group__aranges.html#ga9b628e21a71f4280f93788815796ef92
97
1.69k
int arange_processing_example(Dwarf_Debug dbg, Dwarf_Error *error) {
98
1.69k
  Dwarf_Signed count = 0;
99
1.69k
  Dwarf_Arange *arange = 0;
100
1.69k
  int res = 0;
101
102
1.69k
  res = dwarf_get_aranges(dbg, &arange, &count, error);
103
1.69k
  if (res == DW_DLV_OK) {
104
250
    Dwarf_Signed i = 0;
105
106
108k
    for (i = 0; i < count; ++i) {
107
108k
      Dwarf_Arange ara = arange[i];
108
108k
      Dwarf_Unsigned segment = 0;
109
108k
      Dwarf_Unsigned segment_entry_size = 0;
110
108k
      Dwarf_Addr start = 0;
111
108k
      Dwarf_Unsigned length = 0;
112
108k
      Dwarf_Off cu_die_offset = 0;
113
114
108k
      res = dwarf_get_arange_info_b(ara, &segment, &segment_entry_size, &start,
115
108k
                                    &length, &cu_die_offset, error);
116
108k
      if (res != DW_DLV_OK) {
117
145
        cleanup_bad_arange(dbg, arange, i, count);
118
145
        dwarf_dealloc(dbg, arange, DW_DLA_LIST);
119
145
        return res;
120
145
      }
121
108k
      dwarf_dealloc(dbg, ara, DW_DLA_ARANGE);
122
108k
      arange[i] = 0;
123
108k
    }
124
105
    dwarf_dealloc(dbg, arange, DW_DLA_LIST);
125
105
  }
126
1.55k
  return res;
127
1.69k
}