/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 | 45.7k | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
15 | 45.7k | return vf->length ; |
16 | 45.7k | } sndfile_alt_fuzzer.cc:vfget_filelen(void*) Line | Count | Source | 14 | 23.9k | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 15 | 23.9k | return vf->length ; | 16 | 23.9k | } |
sndfile_fuzzer.cc:vfget_filelen(void*) Line | Count | Source | 14 | 21.8k | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 15 | 21.8k | return vf->length ; | 16 | 21.8k | } |
|
17 | | |
18 | | static sf_count_t vfseek (sf_count_t offset, int whence, void *user_data) |
19 | 958k | { |
20 | 958k | VIO_DATA *vf = (VIO_DATA *)user_data ; |
21 | 958k | sf_count_t new_offset ; |
22 | | |
23 | 958k | switch (whence) |
24 | 958k | { case SEEK_SET : |
25 | 97.0k | new_offset = offset ; |
26 | 97.0k | break ; |
27 | | |
28 | 861k | case SEEK_CUR : |
29 | 861k | new_offset = vf->offset + offset ; |
30 | 861k | 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 | 958k | } |
42 | | |
43 | | /* Ensure you can't seek outside the data */ |
44 | 958k | if (new_offset > vf->length) |
45 | 5.94k | { /* Trying to seek past the end of the data */ |
46 | 5.94k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" |
47 | 5.94k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", |
48 | 5.94k | new_offset, vf->length, whence, vf->offset, offset) ; |
49 | 5.94k | new_offset = vf->length ; |
50 | 5.94k | } |
51 | 952k | else if (new_offset < 0) |
52 | 614k | { /* Trying to seek before the start of the data */ |
53 | 614k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" |
54 | 614k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", |
55 | 614k | new_offset, whence, vf->offset, vf->length, offset) ; |
56 | 614k | new_offset = 0 ; |
57 | 614k | } |
58 | 958k | vf->offset = new_offset ; |
59 | | |
60 | 958k | return vf->offset ; |
61 | 958k | } sndfile_alt_fuzzer.cc:vfseek(long, int, void*) Line | Count | Source | 19 | 489k | { | 20 | 489k | VIO_DATA *vf = (VIO_DATA *)user_data ; | 21 | 489k | sf_count_t new_offset ; | 22 | | | 23 | 489k | switch (whence) | 24 | 489k | { case SEEK_SET : | 25 | 59.0k | new_offset = offset ; | 26 | 59.0k | break ; | 27 | | | 28 | 430k | case SEEK_CUR : | 29 | 430k | new_offset = vf->offset + offset ; | 30 | 430k | 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 | 489k | } | 42 | | | 43 | | /* Ensure you can't seek outside the data */ | 44 | 489k | if (new_offset > vf->length) | 45 | 2.99k | { /* Trying to seek past the end of the data */ | 46 | 2.99k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" | 47 | 2.99k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", | 48 | 2.99k | new_offset, vf->length, whence, vf->offset, offset) ; | 49 | 2.99k | new_offset = vf->length ; | 50 | 2.99k | } | 51 | 486k | else if (new_offset < 0) | 52 | 331k | { /* Trying to seek before the start of the data */ | 53 | 331k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" | 54 | 331k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", | 55 | 331k | new_offset, whence, vf->offset, vf->length, offset) ; | 56 | 331k | new_offset = 0 ; | 57 | 331k | } | 58 | 489k | vf->offset = new_offset ; | 59 | | | 60 | 489k | return vf->offset ; | 61 | 489k | } |
sndfile_fuzzer.cc:vfseek(long, int, void*) Line | Count | Source | 19 | 468k | { | 20 | 468k | VIO_DATA *vf = (VIO_DATA *)user_data ; | 21 | 468k | sf_count_t new_offset ; | 22 | | | 23 | 468k | switch (whence) | 24 | 468k | { case SEEK_SET : | 25 | 37.9k | new_offset = offset ; | 26 | 37.9k | break ; | 27 | | | 28 | 430k | case SEEK_CUR : | 29 | 430k | new_offset = vf->offset + offset ; | 30 | 430k | 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 | 468k | } | 42 | | | 43 | | /* Ensure you can't seek outside the data */ | 44 | 468k | if (new_offset > vf->length) | 45 | 2.95k | { /* Trying to seek past the end of the data */ | 46 | 2.95k | printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");" | 47 | 2.95k | " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n", | 48 | 2.95k | new_offset, vf->length, whence, vf->offset, offset) ; | 49 | 2.95k | new_offset = vf->length ; | 50 | 2.95k | } | 51 | 465k | else if (new_offset < 0) | 52 | 283k | { /* Trying to seek before the start of the data */ | 53 | 283k | printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset" | 54 | 283k | "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n", | 55 | 283k | new_offset, whence, vf->offset, vf->length, offset) ; | 56 | 283k | new_offset = 0 ; | 57 | 283k | } | 58 | 468k | vf->offset = new_offset ; | 59 | | | 60 | 468k | return vf->offset ; | 61 | 468k | } |
|
62 | | |
63 | | static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data) |
64 | 32.8M | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
65 | | |
66 | 32.8M | if (vf->offset + count > vf->length) |
67 | 19.2M | count = vf->length - vf->offset ; |
68 | | |
69 | 32.8M | memcpy(ptr, vf->data + vf->offset, count) ; |
70 | 32.8M | vf->offset += count ; |
71 | | |
72 | 32.8M | return count ; |
73 | 32.8M | } sndfile_alt_fuzzer.cc:vfread(void*, long, void*) Line | Count | Source | 64 | 16.1M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 65 | | | 66 | 16.1M | if (vf->offset + count > vf->length) | 67 | 9.62M | count = vf->length - vf->offset ; | 68 | | | 69 | 16.1M | memcpy(ptr, vf->data + vf->offset, count) ; | 70 | 16.1M | vf->offset += count ; | 71 | | | 72 | 16.1M | return count ; | 73 | 16.1M | } |
sndfile_fuzzer.cc:vfread(void*, long, void*) Line | Count | Source | 64 | 16.6M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 65 | | | 66 | 16.6M | if (vf->offset + count > vf->length) | 67 | 9.64M | count = vf->length - vf->offset ; | 68 | | | 69 | 16.6M | memcpy(ptr, vf->data + vf->offset, count) ; | 70 | 16.6M | vf->offset += count ; | 71 | | | 72 | 16.6M | return count ; | 73 | 16.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 | 5.80M | { VIO_DATA *vf = (VIO_DATA *)user_data ; |
87 | | |
88 | 5.80M | return vf->offset ; |
89 | 5.80M | } sndfile_alt_fuzzer.cc:vftell(void*) Line | Count | Source | 86 | 3.05M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 87 | | | 88 | 3.05M | return vf->offset ; | 89 | 3.05M | } |
sndfile_fuzzer.cc:vftell(void*) Line | Count | Source | 86 | 2.75M | { VIO_DATA *vf = (VIO_DATA *)user_data ; | 87 | | | 88 | 2.75M | return vf->offset ; | 89 | 2.75M | } |
|
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 | 41.6k | { |
97 | | // Initialize the virtual IO structure. |
98 | 41.6k | vio->get_filelen = vfget_filelen ; |
99 | 41.6k | vio->seek = vfseek ; |
100 | 41.6k | vio->read = vfread ; |
101 | 41.6k | vio->write = vfwrite ; |
102 | 41.6k | vio->tell = vftell ; |
103 | | |
104 | | // Initialize the VIO user data. |
105 | 41.6k | vio_data->data = data ; |
106 | 41.6k | vio_data->length = size ; |
107 | 41.6k | vio_data->offset = 0 ; |
108 | | |
109 | 41.6k | memset(sndfile_info, 0, sizeof(SF_INFO)) ; |
110 | | |
111 | | // Try and open the virtual file. |
112 | 41.6k | *sndfile = sf_open_virtual(vio, SFM_READ, sndfile_info, vio_data) ; |
113 | | |
114 | 41.6k | if (sndfile_info->channels == 0) |
115 | 33.1k | return -1 ; |
116 | | |
117 | 8.51k | if (sndfile_info->channels > 1024 * 1024) |
118 | 0 | return -1 ; |
119 | | |
120 | 8.51k | return 0; |
121 | 8.51k | } |
122 | | |
123 | | #endif |