123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #ifndef SNDFILE_FUZZ_HEADER_H
- #define SNDFILE_FUZZ_HEADER_H
- typedef struct
- {
- sf_count_t offset ;
- sf_count_t length ;
- const unsigned char *data ;
- } VIO_DATA ;
- static sf_count_t vfget_filelen (void *user_data)
- { VIO_DATA *vf = (VIO_DATA *)user_data ;
- return vf->length ;
- }
- static sf_count_t vfseek (sf_count_t offset, int whence, void *user_data)
- {
- VIO_DATA *vf = (VIO_DATA *)user_data ;
- sf_count_t new_offset ;
- switch (whence)
- { case SEEK_SET :
- new_offset = offset ;
- break ;
- case SEEK_CUR :
- new_offset = vf->offset + offset ;
- break ;
- case SEEK_END :
- new_offset = vf->length + offset ;
- break ;
- default :
- break ;
- }
- /* Ensure you can't seek outside the data */
- if (new_offset > vf->length)
- { /* Trying to seek past the end of the data */
- printf("vf overseek: new_offset(%" PRId64 ") > vf->length(%" PRId64 ");"
- " whence(%d), vf->offset(%" PRId64 "), offset(%" PRId64 ")\n",
- new_offset, vf->length, whence, vf->offset, offset) ;
- new_offset = vf->length ;
- }
- else if (new_offset < 0)
- { /* Trying to seek before the start of the data */
- printf("vf underseek: new_offset(%" PRId64 ") < 0; whence(%d), vf->offset"
- "(%" PRId64 "), vf->length(%" PRId64 "), offset(%" PRId64 ")\n",
- new_offset, whence, vf->offset, vf->length, offset) ;
- new_offset = 0 ;
- }
- vf->offset = new_offset ;
- return vf->offset ;
- }
- static sf_count_t vfread (void *ptr, sf_count_t count, void *user_data)
- { VIO_DATA *vf = (VIO_DATA *)user_data ;
- if (vf->offset + count > vf->length)
- count = vf->length - vf->offset ;
- memcpy(ptr, vf->data + vf->offset, count) ;
- vf->offset += count ;
- return count ;
- }
- static sf_count_t vfwrite (const void *ptr, sf_count_t count, void *user_data)
- {
- (void)ptr ;
- (void)count ;
- (void)user_data ;
- // Cannot write to this virtual file.
- return 0;
- }
- static sf_count_t vftell (void *user_data)
- { VIO_DATA *vf = (VIO_DATA *)user_data ;
- return vf->offset ;
- }
- int sf_init_file(const uint8_t *data,
- size_t size,
- SNDFILE **sndfile,
- VIO_DATA *vio_data,
- SF_VIRTUAL_IO *vio, SF_INFO *sndfile_info)
- { float* read_buffer = NULL ;
- // Initialize the virtual IO structure.
- vio->get_filelen = vfget_filelen ;
- vio->seek = vfseek ;
- vio->read = vfread ;
- vio->write = vfwrite ;
- vio->tell = vftell ;
- // Initialize the VIO user data.
- vio_data->data = data ;
- vio_data->length = size ;
- vio_data->offset = 0 ;
- memset(sndfile_info, 0, sizeof(SF_INFO)) ;
- // Try and open the virtual file.
- *sndfile = sf_open_virtual(vio, SFM_READ, sndfile_info, vio_data) ;
- if (sndfile_info->channels == 0)
- return -1 ;
- if (sndfile_info->channels > 1024 * 1024)
- return -1 ;
- return 0;
- }
- #endif
|