Coverage Report

Created: 2025-07-11 06:45

/src/libsndfile/ossfuzz/sndfile_alt_fuzzer.cc
Line
Count
Source (jump to first uncovered line)
1
#include <stdlib.h>
2
#include <string.h>
3
#include <sys/types.h>
4
#include <sndfile.h>
5
#include <inttypes.h>
6
7
#include "sndfile_fuzz_header.h"
8
9
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
10
21.4k
{   // One byte is needed for deciding which function to target.
11
21.4k
    if (size == 0)
12
0
       return 0 ;
13
14
21.4k
    const uint8_t decider = *data ;
15
21.4k
    data += 1 ;
16
21.4k
    size -= 1 ;
17
18
21.4k
    SF_INFO sndfile_info ;
19
21.4k
    VIO_DATA vio_data ;
20
21.4k
    SF_VIRTUAL_IO vio ;
21
21.4k
    SNDFILE *sndfile = NULL ;
22
21.4k
    int err = sf_init_file(data, size, &sndfile, &vio_data, &vio, &sndfile_info) ;
23
21.4k
    if (err)
24
16.1k
      goto EXIT_LABEL ;
25
26
    // Just the right number of channels. Create some buffer space for reading.
27
5.24k
    switch (decider % 3)
28
5.24k
    {   case 0  :
29
1.80k
                {
30
1.80k
                  short* read_buffer = NULL ;
31
1.80k
                  read_buffer = (short*)malloc(sizeof(short) * size);
32
1.80k
                  if (read_buffer == NULL)
33
0
                    abort() ;
34
35
1.70M
                  while (sf_read_short(sndfile, read_buffer, size))
36
1.70M
                  {
37
                    // Do nothing with the data.
38
1.70M
                  }
39
1.80k
                  free(read_buffer) ;
40
1.80k
                }
41
0
                break ;
42
1.67k
        case 1  :
43
1.67k
                {
44
1.67k
                  int* read_buffer = NULL ;
45
1.67k
                  read_buffer = (int*)malloc(sizeof(int) * size) ;
46
1.67k
                  if (read_buffer == NULL)
47
0
                    abort() ;
48
49
2.62M
                  while (sf_read_int(sndfile, read_buffer, size))
50
2.62M
                  {
51
                    // Do nothing with the data.
52
2.62M
                  }
53
1.67k
                  free(read_buffer) ;
54
1.67k
                }
55
0
                break ;
56
1.76k
        case 2  :
57
1.76k
                {
58
1.76k
                  double* read_buffer = NULL ;
59
1.76k
                  read_buffer = (double*)malloc(sizeof(double) * size) ;
60
1.76k
                  if (read_buffer == NULL)
61
0
                    abort() ;
62
63
2.10M
                  while (sf_read_double(sndfile, read_buffer, size))
64
2.10M
                  {
65
                    // Do nothing with the data.
66
2.10M
                  }
67
1.76k
                  free(read_buffer) ;
68
1.76k
                }
69
0
                break ;
70
0
        default :
71
0
                break ;
72
5.24k
                } ;
73
74
21.4k
  EXIT_LABEL:
75
21.4k
    if (sndfile != NULL)
76
5.24k
      sf_close(sndfile);
77
78
21.4k
    return 0 ;
79
5.24k
}