1#ifndef SNDFILE_FUZZ_HEADER_H
2#define SNDFILE_FUZZ_HEADER_H
3
4typedef struct
5{
6  sf_count_t offset ;
7  sf_count_t length ;
8  const unsigned char *data ;
9} VIO_DATA ;
10
11static sf_count_t vfget_filelen (void *user_data)
12{  VIO_DATA *vf = (VIO_DATA *)user_data ;
13   return vf->length ;
14}
15
16static sf_count_t vfseek (sf_count_t offset, int whence, void *user_data)
17{
18  VIO_DATA *vf = (VIO_DATA *)user_data ;
19  sf_count_t new_offset ;
20
21  switch (whence)
22  {   case SEEK_SET :
23        new_offset = offset ;
24        break ;
25
26    case SEEK_CUR :
27        new_offset = vf->offset + offset ;
28        break ;
29
30    case SEEK_END :
31        new_offset = vf->length + offset ;
32        break ;
33
34    default :
35        break ;
36  }
37
38  /* Ensure you can't seek outside the data */
39  if (new_offset > vf->length)
40  {  /* Trying to seek past the end of the data */
41     printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");"
42            "  whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n",
43            new_offset, vf->length, whence, vf->offset, offset) ;
44     new_offset = vf->length ;
45  }
46  else if (new_offset < 0)
47  {  /* Trying to seek before the start of the data */
48     printf("vf underseek: new_offset(%" PRId64 ") < 0;  whence(%d), vf->offset"
49            "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n",
50            new_offset, whence, vf->offset, vf->length, offset) ;
51     new_offset = 0 ;
52  }
53  vf->offset = new_offset ;
54
55  return vf->offset ;
56}
57
58static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data)
59{  VIO_DATA *vf = (VIO_DATA *)user_data ;
60
61   if (vf->offset + count > vf->length)
62     count = vf->length - vf->offset ;
63
64   memcpy(ptr, vf->data + vf->offset, count) ;
65   vf->offset += count ;
66
67   return count ;
68}
69
70static sf_count_t vfwrite (const void *ptr, sf_count_t count, void *user_data)
71{
72  (void)ptr ;
73  (void)count ;
74  (void)user_data ;
75
76  // Cannot write to this virtual file.
77  return 0;
78}
79
80static sf_count_t vftell (void *user_data)
81{ VIO_DATA *vf = (VIO_DATA *)user_data ;
82
83  return vf->offset ;
84}
85
86int sf_init_file(const uint8_t *data,
87                size_t size,
88                SNDFILE **sndfile,
89                VIO_DATA *vio_data,
90                SF_VIRTUAL_IO *vio, SF_INFO *sndfile_info)
91{  float* read_buffer = NULL ;
92
93   // Initialize the virtual IO structure.
94   vio->get_filelen = vfget_filelen ;
95   vio->seek = vfseek ;
96   vio->read = vfread ;
97   vio->write = vfwrite ;
98   vio->tell = vftell ;
99
100   // Initialize the VIO user data.
101   vio_data->data = data ;
102   vio_data->length = size ;
103   vio_data->offset = 0 ;
104
105   memset(sndfile_info, 0, sizeof(SF_INFO)) ;
106
107   // Try and open the virtual file.
108   *sndfile = sf_open_virtual(vio, SFM_READ, sndfile_info, vio_data) ;
109
110   if (sndfile_info->channels == 0)
111		 return -1 ;
112
113   if (sndfile_info->channels > 1024 * 1024)
114		 return -1 ;
115
116   return 0;
117}
118
119#endif
120