Skip to content

Commit 75ba42a

Browse files
author
Evgeny Khramtsov
committed
Improve EOF processing for potential re-reading
1 parent 4b22c17 commit 75ba42a

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/reading.rs

+17-2
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,21 @@ impl<T :io::Read + io::Seek> PacketReader<T> {
761761
if let Some(pck) = self.base_pck_rdr.read_packet() {
762762
return Ok(Some(pck));
763763
}
764-
let page = tri!(self.read_ogg_page());
764+
// Save the current position to rewind if EOF is reached.
765+
let pos = tri!(self.rdr.stream_position());
766+
let page = tri!(match self.read_ogg_page() {
767+
Err(OggReadError::ReadError(e)) if e.kind() == ErrorKind::UnexpectedEof => {
768+
// Rewind to the saved position to allow for potential re-reading.
769+
self.rdr.seek(SeekFrom::Start(pos))?;
770+
Err(OggReadError::ReadError(e))
771+
}
772+
Ok(None) => {
773+
// Rewind to the saved position to allow for potential re-reading.
774+
self.rdr.seek(SeekFrom::Start(pos))?;
775+
Ok(None)
776+
}
777+
ret => ret,
778+
});
765779
match page {
766780
Some(page) => tri!(self.base_pck_rdr.push_page(page)),
767781
None => return Ok(None),
@@ -818,7 +832,8 @@ impl<T :io::Read + io::Seek> PacketReader<T> {
818832
let header_buf :[u8; 27] = match tri!(self.read_until_pg_header()) {
819833
Some(s) => s,
820834
None if self.read_some_pg => return Ok(None),
821-
None => return Err(OggReadError::NoCapturePatternFound)
835+
None => tri!(Err(Error::new(ErrorKind::UnexpectedEof,
836+
"Expected ogg packet but found end of physical stream"))),
822837
};
823838
let (mut pg_prs, page_segments) = tri!(PageParser::new(header_buf));
824839

src/test.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,8 @@ fn test_issue_14() {
542542
// data is treated as invalid.
543543
#[test]
544544
fn test_issue_7() {
545+
use std::io::ErrorKind::UnexpectedEof;
546+
545547
let mut c = Cursor::new(Vec::new());
546548
let test_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
547549
let test_arr_2 = [2, 4, 8, 16, 32, 64, 128, 127, 126, 125, 124];
@@ -564,17 +566,19 @@ fn test_issue_7() {
564566
assert!(r.read_packet().unwrap().is_none());
565567
}
566568

567-
// Non-Ogg data should return an error.
569+
// Truncated data should return the UnexpectedEof error.
568570
let c = Cursor::new(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
569571
{
570572
let mut r = PacketReader::new(c);
571-
assert!(matches!(r.read_packet(), Err(OggReadError::NoCapturePatternFound)));
573+
assert!(matches!(r.read_packet(),
574+
Err(OggReadError::ReadError(e)) if e.kind() == UnexpectedEof));
572575
}
573576

574-
// Empty data is considered non-Ogg data.
577+
// Empty data should return the UnexpectedEof error.
575578
let c = Cursor::new(&[]);
576579
{
577580
let mut r = PacketReader::new(c);
578-
assert!(matches!(r.read_packet(), Err(OggReadError::NoCapturePatternFound)));
581+
assert!(matches!(r.read_packet(),
582+
Err(OggReadError::ReadError(e)) if e.kind() == UnexpectedEof));
579583
}
580584
}

0 commit comments

Comments
 (0)