Coverage Report

Created: 2026-08-31 06:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libsndfile/ossfuzz/sndfile_fuzz_header.h
Line
Count
Source
1
#ifndef SNDFILE_FUZZ_HEADER_H
2
#define SNDFILE_FUZZ_HEADER_H
3
4
#include <errno.h>
5
6
typedef struct
7
{
8
  sf_count_t offset ;
9
  sf_count_t length ;
10
  const unsigned char *data ;
11
} VIO_DATA ;
12
13
static sf_count_t vfget_filelen (void *user_data)
14
33.3k
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
15
33.3k
   return vf->length ;
16
33.3k
}
sndfile_alt_fuzzer.cc:vfget_filelen(void*)
Line
Count
Source
14
12.2k
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
15
12.2k
   return vf->length ;
16
12.2k
}
sndfile_fuzzer.cc:vfget_filelen(void*)
Line
Count
Source
14
21.1k
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
15
21.1k
   return vf->length ;
16
21.1k
}
17
18
static sf_count_t vfseek (sf_count_t offset, int whence, void *user_data)
19
1.80M
{
20
1.80M
  VIO_DATA *vf = (VIO_DATA *)user_data ;
21
1.80M
  sf_count_t new_offset ;
22
23
1.80M
  switch (whence)
24
1.80M
  {   case SEEK_SET :
25
81.5k
        new_offset = offset ;
26
81.5k
        break ;
27
28
1.72M
    case SEEK_CUR :
29
1.72M
        new_offset = vf->offset + offset ;
30
1.72M
        break ;
31
32
0
    case SEEK_END :
33
0
        new_offset = vf->length + offset ;
34
0
        break ;
35
36
0
    default :
37
        // SEEK_DATA and SEEK_HOLE are not supported by this function.
38
0
        errno = EINVAL ;
39
0
        return -1 ;
40
0
        break ;
41
1.80M
  }
42
43
  /* Ensure you can't seek outside the data */
44
1.80M
  if (new_offset > vf->length)
45
4.55k
  {  /* Trying to seek past the end of the data */
46
4.55k
     printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");"
47
4.55k
            "  whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n",
48
4.55k
            new_offset, vf->length, whence, vf->offset, offset) ;
49
4.55k
     new_offset = vf->length ;
50
4.55k
  }
51
1.80M
  else if (new_offset < 0)
52
384k
  {  /* Trying to seek before the start of the data */
53
384k
     printf("vf underseek: new_offset(%" PRId64 ") < 0;  whence(%d), vf->offset"
54
384k
            "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n",
55
384k
            new_offset, whence, vf->offset, vf->length, offset) ;
56
384k
     new_offset = 0 ;
57
384k
  }
58
1.80M
  vf->offset = new_offset ;
59
60
1.80M
  return vf->offset ;
61
1.80M
}
sndfile_alt_fuzzer.cc:vfseek(long, int, void*)
Line
Count
Source
19
521k
{
20
521k
  VIO_DATA *vf = (VIO_DATA *)user_data ;
21
521k
  sf_count_t new_offset ;
22
23
521k
  switch (whence)
24
521k
  {   case SEEK_SET :
25
41.6k
        new_offset = offset ;
26
41.6k
        break ;
27
28
480k
    case SEEK_CUR :
29
480k
        new_offset = vf->offset + offset ;
30
480k
        break ;
31
32
0
    case SEEK_END :
33
0
        new_offset = vf->length + offset ;
34
0
        break ;
35
36
0
    default :
37
        // SEEK_DATA and SEEK_HOLE are not supported by this function.
38
0
        errno = EINVAL ;
39
0
        return -1 ;
40
0
        break ;
41
521k
  }
42
43
  /* Ensure you can't seek outside the data */
44
521k
  if (new_offset > vf->length)
45
1.58k
  {  /* Trying to seek past the end of the data */
46
1.58k
     printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");"
47
1.58k
            "  whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n",
48
1.58k
            new_offset, vf->length, whence, vf->offset, offset) ;
49
1.58k
     new_offset = vf->length ;
50
1.58k
  }
51
520k
  else if (new_offset < 0)
52
135k
  {  /* Trying to seek before the start of the data */
53
135k
     printf("vf underseek: new_offset(%" PRId64 ") < 0;  whence(%d), vf->offset"
54
135k
            "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n",
55
135k
            new_offset, whence, vf->offset, vf->length, offset) ;
56
135k
     new_offset = 0 ;
57
135k
  }
58
521k
  vf->offset = new_offset ;
59
60
521k
  return vf->offset ;
61
521k
}
sndfile_fuzzer.cc:vfseek(long, int, void*)
Line
Count
Source
19
1.28M
{
20
1.28M
  VIO_DATA *vf = (VIO_DATA *)user_data ;
21
1.28M
  sf_count_t new_offset ;
22
23
1.28M
  switch (whence)
24
1.28M
  {   case SEEK_SET :
25
39.9k
        new_offset = offset ;
26
39.9k
        break ;
27
28
1.24M
    case SEEK_CUR :
29
1.24M
        new_offset = vf->offset + offset ;
30
1.24M
        break ;
31
32
0
    case SEEK_END :
33
0
        new_offset = vf->length + offset ;
34
0
        break ;
35
36
0
    default :
37
        // SEEK_DATA and SEEK_HOLE are not supported by this function.
38
0
        errno = EINVAL ;
39
0
        return -1 ;
40
0
        break ;
41
1.28M
  }
42
43
  /* Ensure you can't seek outside the data */
44
1.28M
  if (new_offset > vf->length)
45
2.96k
  {  /* Trying to seek past the end of the data */
46
2.96k
     printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");"
47
2.96k
            "  whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n",
48
2.96k
            new_offset, vf->length, whence, vf->offset, offset) ;
49
2.96k
     new_offset = vf->length ;
50
2.96k
  }
51
1.28M
  else if (new_offset < 0)
52
248k
  {  /* Trying to seek before the start of the data */
53
248k
     printf("vf underseek: new_offset(%" PRId64 ") < 0;  whence(%d), vf->offset"
54
248k
            "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n",
55
248k
            new_offset, whence, vf->offset, vf->length, offset) ;
56
248k
     new_offset = 0 ;
57
248k
  }
58
1.28M
  vf->offset = new_offset ;
59
60
1.28M
  return vf->offset ;
61
1.28M
}
62
63
static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data)
64
23.5M
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
65
66
23.5M
   if (vf->offset + count > vf->length)
67
13.6M
     count = vf->length - vf->offset ;
68
69
23.5M
   memcpy(ptr, vf->data + vf->offset, count) ;
70
23.5M
   vf->offset += count ;
71
72
23.5M
   return count ;
73
23.5M
}
sndfile_alt_fuzzer.cc:vfread(void*, long, void*)
Line
Count
Source
64
9.91M
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
65
66
9.91M
   if (vf->offset + count > vf->length)
67
6.04M
     count = vf->length - vf->offset ;
68
69
9.91M
   memcpy(ptr, vf->data + vf->offset, count) ;
70
9.91M
   vf->offset += count ;
71
72
9.91M
   return count ;
73
9.91M
}
sndfile_fuzzer.cc:vfread(void*, long, void*)
Line
Count
Source
64
13.6M
{  VIO_DATA *vf = (VIO_DATA *)user_data ;
65
66
13.6M
   if (vf->offset + count > vf->length)
67
7.61M
     count = vf->length - vf->offset ;
68
69
13.6M
   memcpy(ptr, vf->data + vf->offset, count) ;
70
13.6M
   vf->offset += count ;
71
72
13.6M
   return count ;
73
13.6M
}
74
75
static sf_count_t vfwrite (const void *ptr, sf_count_t count, void *user_data)
76
0
{
77
0
  (void)ptr ;
78
0
  (void)count ;
79
0
  (void)user_data ;
80
81
  // Cannot write to this virtual file.
82
0
  return 0;
83
0
}
Unexecuted instantiation: sndfile_alt_fuzzer.cc:vfwrite(void const*, long, void*)
Unexecuted instantiation: sndfile_fuzzer.cc:vfwrite(void const*, long, void*)
84
85
static sf_count_t vftell (void *user_data)
86
11.6M
{ VIO_DATA *vf = (VIO_DATA *)user_data ;
87
88
11.6M
  return vf->offset ;
89
11.6M
}
sndfile_alt_fuzzer.cc:vftell(void*)
Line
Count
Source
86
2.49M
{ VIO_DATA *vf = (VIO_DATA *)user_data ;
87
88
2.49M
  return vf->offset ;
89
2.49M
}
sndfile_fuzzer.cc:vftell(void*)
Line
Count
Source
86
9.19M
{ VIO_DATA *vf = (VIO_DATA *)user_data ;
87
88
9.19M
  return vf->offset ;
89
9.19M
}
90
91
int sf_init_file(const uint8_t *data, 
92
                size_t size, 
93
                SNDFILE **sndfile, 
94
                VIO_DATA *vio_data, 
95
                SF_VIRTUAL_IO *vio, SF_INFO *sndfile_info)
96
30.4k
{
97
   // Initialize the virtual IO structure.
98
30.4k
   vio->get_filelen = vfget_filelen ;
99
30.4k
   vio->seek = vfseek ;
100
30.4k
   vio->read = vfread ;
101
30.4k
   vio->write = vfwrite ;
102
30.4k
   vio->tell = vftell ;
103
104
   // Initialize the VIO user data.
105
30.4k
   vio_data->data = data ;
106
30.4k
   vio_data->length = size ;
107
30.4k
   vio_data->offset = 0 ;
108
109
30.4k
   memset(sndfile_info, 0, sizeof(SF_INFO)) ;
110
111
   // Try and open the virtual file.
112
30.4k
   *sndfile = sf_open_virtual(vio, SFM_READ, sndfile_info, vio_data) ;
113
114
30.4k
   if (sndfile_info->channels == 0)
115
24.5k
     return -1 ;
116
117
5.93k
   if (sndfile_info->channels > 1024 * 1024)
118
0
     return -1 ;
119
120
5.93k
   return 0;
121
5.93k
}
122
123
#endif