core/byteio: check for end boundary in BoundedFileReader reads
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 15 Nov 2021 16:27:15 +0000 (17:27 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 15 Nov 2021 16:27:15 +0000 (17:27 +0100)
nihav-core/src/io/byteio.rs

index b3d06216d842c2a9790aff6dd7cb499bfd2d2ea0..2bac1900967b74545e411ccf0d8c5f886c07c775 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,6 +742,12 @@ 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); }
@@ -743,6 +755,9 @@ impl<T: Read+Seek> ByteIO for BoundedFileReader<T> {
         if sz < len {
             if let Err(_err) = self.file.read(&mut buf[sz..][..1]) {
                 self.eof = true;
+                if sz == 0 {
+                    return Err(ByteIOError::EOF);
+                }
             } else {
                 return Ok(sz + 1);
             }