core/io: hopefully fix BoundedFileReader::read_buf_some() for good
[nihav.git] / nihav-core / src / io / byteio.rs
index b3d06216d842c2a9790aff6dd7cb499bfd2d2ea0..0ff54cb13ed9321e31f794dbea03e8365d53dc39 100644 (file)
@@ -717,6 +717,12 @@ impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
     }
 
     fn read_buf(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        if let Some(epos) = self.end {
+            if self.real_tell() >= epos {
+                self.eof = true;
+                return Err(ByteIOError::EOF);
+            }
+        }
         let len = self.max_read_len(buf.len());
         match self.file.read_exact(&mut buf[..len]) {
             Ok(()) if len == buf.len() => Ok(buf.len()),
@@ -736,16 +742,24 @@ impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
     }
 
     fn read_buf_some(&mut self, buf: &mut [u8]) -> ByteIOResult<usize> {
+        if let Some(epos) = self.end {
+            if self.real_tell() >= epos {
+                self.eof = true;
+                return Err(ByteIOError::EOF);
+            }
+        }
         let len = self.max_read_len(buf.len());
         let ret = self.file.read(&mut buf[..len]);
         if ret.is_err() { return Err(ByteIOError::ReadError); }
         let sz = ret.unwrap();
         if sz < len {
-            if let Err(_err) = self.file.read(&mut buf[sz..][..1]) {
-                self.eof = true;
-            } else {
+            if let Ok(1) = self.file.read(&mut buf[sz..][..1]) {
                 return Ok(sz + 1);
             }
+            self.eof = true;
+            if sz == 0 {
+                return Err(ByteIOError::EOF);
+            }
         }
         Ok(sz)
     }