/src/libsndfile/ossfuzz/sndfile_fuzz_header.h
Line | Count | Source (jump to first uncovered line) |
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 | 44.1k | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
15 | 44.1k | return vf->length ; |
16 | 44.1k | } sndfile_alt_fuzzer.cc:vfget_filelen(void*) Line | Count | Source | 14 | 23.0k | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 15 | 23.0k | return vf->length ; | 16 | 23.0k | } |
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 | 848k | { |
20 | 848k | VIO_DATA *vf = (VIO_DATA *)user_data ; |
21 | 848k | sf_count_t new_offset ; |
22 | | |
23 | 848k | switch (whence) |
24 | 848k | { case SEEK_SET : |
25 | 112k | new_offset = offset ; |
26 | 112k | break ; |
27 | | |
28 | 736k | case SEEK_CUR : |
29 | 736k | new_offset = vf->offset + offset ; |
30 | 736k | 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 | 848k | } |
42 | | |
43 | | /* Ensure you can't seek outside the data */ |
44 | 848k | if (new_offset > vf->length) |
45 | 5.87k | { /* Trying to seek past the end of the data */ |
46 | 5.87k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" |
47 | 5.87k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", |
48 | 5.87k | new_offset, vf->length, whence, vf->offset, offset) ; |
49 | 5.87k | new_offset = vf->length ; |
50 | 5.87k | } |
51 | 842k | else if (new_offset < 0) |
52 | 490k | { /* Trying to seek before the start of the data */ |
53 | 490k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" |
54 | 490k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", |
55 | 490k | new_offset, whence, vf->offset, vf->length, offset) ; |
56 | 490k | new_offset = 0 ; |
57 | 490k | } |
58 | 848k | vf->offset = new_offset ; |
59 | | |
60 | 848k | return vf->offset ; |
61 | 848k | } sndfile_alt_fuzzer.cc:vfseek(long, int, void*) Line | Count | Source | 19 | 478k | { | 20 | 478k | VIO_DATA *vf = (VIO_DATA *)user_data ; | 21 | 478k | sf_count_t new_offset ; | 22 | | | 23 | 478k | switch (whence) | 24 | 478k | { case SEEK_SET : | 25 | 69.7k | new_offset = offset ; | 26 | 69.7k | break ; | 27 | | | 28 | 409k | case SEEK_CUR : | 29 | 409k | new_offset = vf->offset + offset ; | 30 | 409k | 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 | 478k | } | 42 | | | 43 | | /* Ensure you can't seek outside the data */ | 44 | 478k | if (new_offset > vf->length) | 45 | 2.78k | { /* Trying to seek past the end of the data */ | 46 | 2.78k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" | 47 | 2.78k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", | 48 | 2.78k | new_offset, vf->length, whence, vf->offset, offset) ; | 49 | 2.78k | new_offset = vf->length ; | 50 | 2.78k | } | 51 | 476k | else if (new_offset < 0) | 52 | 272k | { /* Trying to seek before the start of the data */ | 53 | 272k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" | 54 | 272k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", | 55 | 272k | new_offset, whence, vf->offset, vf->length, offset) ; | 56 | 272k | new_offset = 0 ; | 57 | 272k | } | 58 | 478k | vf->offset = new_offset ; | 59 | | | 60 | 478k | return vf->offset ; | 61 | 478k | } |
sndfile_fuzzer.cc:vfseek(long, int, void*) Line | Count | Source | 19 | 369k | { | 20 | 369k | VIO_DATA *vf = (VIO_DATA *)user_data ; | 21 | 369k | sf_count_t new_offset ; | 22 | | | 23 | 369k | switch (whence) | 24 | 369k | { case SEEK_SET : | 25 | 42.6k | new_offset = offset ; | 26 | 42.6k | break ; | 27 | | | 28 | 327k | case SEEK_CUR : | 29 | 327k | new_offset = vf->offset + offset ; | 30 | 327k | 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 | 369k | } | 42 | | | 43 | | /* Ensure you can't seek outside the data */ | 44 | 369k | if (new_offset > vf->length) | 45 | 3.09k | { /* Trying to seek past the end of the data */ | 46 | 3.09k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" | 47 | 3.09k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", | 48 | 3.09k | new_offset, vf->length, whence, vf->offset, offset) ; | 49 | 3.09k | new_offset = vf->length ; | 50 | 3.09k | } | 51 | 366k | else if (new_offset < 0) | 52 | 217k | { /* Trying to seek before the start of the data */ | 53 | 217k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" | 54 | 217k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", | 55 | 217k | new_offset, whence, vf->offset, vf->length, offset) ; | 56 | 217k | new_offset = 0 ; | 57 | 217k | } | 58 | 369k | vf->offset = new_offset ; | 59 | | | 60 | 369k | return vf->offset ; | 61 | 369k | } |
|
62 | | |
63 | | static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data) |
64 | 31.3M | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
65 | | |
66 | 31.3M | if (vf->offset + count > vf->length) |
67 | 18.8M | count = vf->length - vf->offset ; |
68 | | |
69 | 31.3M | memcpy(ptr, vf->data + vf->offset, count) ; |
70 | 31.3M | vf->offset += count ; |
71 | | |
72 | 31.3M | return count ; |
73 | 31.3M | } sndfile_alt_fuzzer.cc:vfread(void*, long, void*) Line | Count | Source | 64 | 16.4M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 65 | | | 66 | 16.4M | if (vf->offset + count > vf->length) | 67 | 10.4M | count = vf->length - vf->offset ; | 68 | | | 69 | 16.4M | memcpy(ptr, vf->data + vf->offset, count) ; | 70 | 16.4M | vf->offset += count ; | 71 | | | 72 | 16.4M | return count ; | 73 | 16.4M | } |
sndfile_fuzzer.cc:vfread(void*, long, void*) Line | Count | Source | 64 | 14.8M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 65 | | | 66 | 14.8M | if (vf->offset + count > vf->length) | 67 | 8.41M | count = vf->length - vf->offset ; | 68 | | | 69 | 14.8M | memcpy(ptr, vf->data + vf->offset, count) ; | 70 | 14.8M | vf->offset += count ; | 71 | | | 72 | 14.8M | return count ; | 73 | 14.8M | } |
|
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 | 4.84M | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
87 | | |
88 | 4.84M | return vf->offset ; |
89 | 4.84M | } sndfile_alt_fuzzer.cc:vftell(void*) Line | Count | Source | 86 | 2.70M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 87 | | | 88 | 2.70M | return vf->offset ; | 89 | 2.70M | } |
sndfile_fuzzer.cc:vftell(void*) Line | Count | Source | 86 | 2.13M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 87 | | | 88 | 2.13M | return vf->offset ; | 89 | 2.13M | } |
|
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 | 40.1k | { |
97 | | // Initialize the virtual IO structure. |
98 | 40.1k | vio->get_filelen = vfget_filelen ; |
99 | 40.1k | vio->seek = vfseek ; |
100 | 40.1k | vio->read = vfread ; |
101 | 40.1k | vio->write = vfwrite ; |
102 | 40.1k | vio->tell = vftell ; |
103 | | |
104 | | // Initialize the VIO user data. |
105 | 40.1k | vio_data->data = data ; |
106 | 40.1k | vio_data->length = size ; |
107 | 40.1k | vio_data->offset = 0 ; |
108 | | |
109 | 40.1k | memset(sndfile_info, 0, sizeof(SF_INFO)) ; |
110 | | |
111 | | // Try and open the virtual file. |
112 | 40.1k | *sndfile = sf_open_virtual(vio, SFM_READ, sndfile_info, vio_data) ; |
113 | | |
114 | 40.1k | if (sndfile_info->channels == 0) |
115 | 31.4k | return -1 ; |
116 | | |
117 | 8.65k | if (sndfile_info->channels > 1024 * 1024) |
118 | 0 | return -1 ; |
119 | | |
120 | 8.65k | return 0; |
121 | 8.65k | } |
122 | | |
123 | | #endif |