]> git.proxmox.com Git - proxmox-backup.git/commitdiff
tape: SgTapeReader::read_block - disable reading beyond EOF
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 13 Apr 2021 09:44:06 +0000 (11:44 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 13 Apr 2021 09:46:30 +0000 (11:46 +0200)
src/tape/drive/lto/sg_tape.rs

index 3f73e025d9efa38b637da4162dfc87708d4d8f0d..7faa16390ec5329e7a3131e8fe848c491bf96aaf 100644 (file)
@@ -694,19 +694,30 @@ impl Drop for SgTape {
 
 pub struct SgTapeReader<'a> {
     sg_tape: &'a mut SgTape,
+    end_of_file: bool,
 }
 
 impl <'a> SgTapeReader<'a> {
 
     pub fn new(sg_tape: &'a mut SgTape) -> Self {
-        Self { sg_tape }
+        Self { sg_tape, end_of_file: false, }
     }
 }
 
 impl <'a> BlockRead for SgTapeReader<'a> {
 
     fn read_block(&mut self, buffer: &mut [u8]) -> Result<usize, BlockReadError> {
-        self.sg_tape.read_block(buffer)
+        if self.end_of_file {
+            return Err(BlockReadError::Error(proxmox::io_format_err!("detected read after EOF!")));
+        }
+        match self.sg_tape.read_block(buffer) {
+            Ok(usize) => Ok(usize),
+            Err(BlockReadError::EndOfFile) => {
+                self.end_of_file = true;
+                Err(BlockReadError::EndOfFile)
+            },
+            Err(err) => Err(err),
+        }
     }
 }