|
@@ -6,7 +6,7 @@
|
|
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
|
|
* *
|
|
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 *
|
|
|
- * by the Xiph.Org Foundation http://www.xiph.org/ *
|
|
|
+ * by the Xiph.Org Foundation https://xiph.org/ *
|
|
|
* *
|
|
|
********************************************************************
|
|
|
|
|
@@ -264,6 +264,10 @@ static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, ogg_int64_t begin,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ /*We started from the beginning of the stream and found nothing.
|
|
|
+ This should be impossible unless the contents of the stream changed out
|
|
|
+ from under us after we read from it.*/
|
|
|
+ if(!begin&&vf->offset<0)return OV_EBADLINK;
|
|
|
}
|
|
|
|
|
|
/* we're not interested in the page... just the serialno and granpos. */
|
|
@@ -1230,7 +1234,6 @@ double ov_time_total(OggVorbis_File *vf,int i){
|
|
|
|
|
|
int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
|
|
|
ogg_stream_state work_os;
|
|
|
- int ret;
|
|
|
|
|
|
if(vf->ready_state<OPENED)return(OV_EINVAL);
|
|
|
if(!vf->seekable)
|
|
@@ -1253,8 +1256,12 @@ int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
|
|
|
vf->current_serialno); /* must set serialno */
|
|
|
vorbis_synthesis_restart(&vf->vd);
|
|
|
|
|
|
- ret=_seek_helper(vf,pos);
|
|
|
- if(ret)goto seek_error;
|
|
|
+ if(_seek_helper(vf,pos)) {
|
|
|
+ /* dump the machine so we're in a known state */
|
|
|
+ vf->pcm_offset=-1;
|
|
|
+ _decode_clear(vf);
|
|
|
+ return OV_EBADLINK;
|
|
|
+ }
|
|
|
|
|
|
/* we need to make sure the pcm_offset is set, but we don't want to
|
|
|
advance the raw cursor past good packets just to get to the first
|
|
@@ -1388,13 +1395,6 @@ int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){
|
|
|
vf->bittrack=0.f;
|
|
|
vf->samptrack=0.f;
|
|
|
return(0);
|
|
|
-
|
|
|
- seek_error:
|
|
|
- /* dump the machine so we're in a known state */
|
|
|
- vf->pcm_offset=-1;
|
|
|
- ogg_stream_clear(&work_os);
|
|
|
- _decode_clear(vf);
|
|
|
- return OV_EBADLINK;
|
|
|
}
|
|
|
|
|
|
/* Page granularity seek (faster than sample granularity because we
|
|
@@ -1964,6 +1964,7 @@ long ov_read_filter(OggVorbis_File *vf,char *buffer,int length,
|
|
|
long samples;
|
|
|
|
|
|
if(vf->ready_state<OPENED)return(OV_EINVAL);
|
|
|
+ if(word<=0)return(OV_EINVAL);
|
|
|
|
|
|
while(1){
|
|
|
if(vf->ready_state==INITSET){
|
|
@@ -1989,6 +1990,8 @@ long ov_read_filter(OggVorbis_File *vf,char *buffer,int length,
|
|
|
long channels=ov_info(vf,-1)->channels;
|
|
|
long bytespersample=word * channels;
|
|
|
vorbis_fpu_control fpu;
|
|
|
+
|
|
|
+ if(channels<1||channels>255)return(OV_EINVAL);
|
|
|
if(samples>length/bytespersample)samples=length/bytespersample;
|
|
|
|
|
|
if(samples <= 0)
|