]> git.lizzy.rs Git - rust.git/commitdiff
std::io::cursor: Fixed Seek so test passes.
authorAmos Onn <amosonn@gmail.com>
Thu, 16 Feb 2017 01:21:08 +0000 (02:21 +0100)
committerAmos Onn <amosonn@gmail.com>
Thu, 16 Feb 2017 02:20:49 +0000 (03:20 +0100)
src/libstd/io/cursor.rs

index 9427e4afa214270ab841f7eeaee8ab7e227b7781..60767ea4786618551f9720c2318db53ef7e3543c 100644 (file)
@@ -200,18 +200,20 @@ pub fn position(&self) -> u64 { self.pos }
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> {
     fn seek(&mut self, style: SeekFrom) -> io::Result<u64> {
-        let pos = match style {
-            SeekFrom::Start(n) => { self.pos = n; return Ok(n) }
-            SeekFrom::End(n) => self.inner.as_ref().len() as i64 + n,
-            SeekFrom::Current(n) => self.pos as i64 + n,
+        let (base_pos, offset) = match style {
+            SeekFrom::Start(n) => { self.pos = n; return Ok(n); }
+            SeekFrom::End(n) => (self.inner.as_ref().len() as u64, n),
+            SeekFrom::Current(n) => (self.pos, n),
         };
-
-        if pos < 0 {
-            Err(Error::new(ErrorKind::InvalidInput,
-                           "invalid seek to a negative position"))
+        let new_pos = if offset >= 0 {
+            base_pos.checked_add(offset as u64)
         } else {
-            self.pos = pos as u64;
-            Ok(self.pos)
+            base_pos.checked_sub((offset.wrapping_neg()) as u64)
+        };
+        match new_pos {
+            Some(n) => {self.pos = n; Ok(self.pos)}
+            None => Err(Error::new(ErrorKind::InvalidInput,
+                           "invalid seek to a negative or overflowing position"))
         }
     }
 }