Check for end_offset < data_offset.
authorTimothy B. Terriberry <tterribe@xiph.org>
Tue, 13 Nov 2012 00:58:40 +0000 (16:58 -0800)
committerTimothy B. Terriberry <tterribe@xiph.org>
Tue, 13 Nov 2012 00:58:40 +0000 (16:58 -0800)
I don't think it actually breaks anything if we don't (seeking will
 fail, but it will fail cleanly).
However, it _is_ an indication that the file data changed out from
 under us (or of another library bug), so we should fail fast.

src/opusfile.c

index bae8d3d..31d013a 100644 (file)
@@ -967,6 +967,8 @@ static int op_find_final_pcm_offset(OggOpusFile *_of,
      cur_serialno,_serialnos,_nserialnos);
     if(OP_UNLIKELY(_offset<0))return (int)_offset;
   }
+  /*At worst we should have found the first page with completed packets.*/
+  if(OP_UNLIKELY(_offset<_link->data_offset))return OP_EBADLINK;
   /*This implementation requires that the difference between the first and last
      granule positions in each link be representable in a signed, 64-bit
      number, and that each link also have at least as many samples as the