about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorAmos Onn <amosonn@gmail.com>2017-02-16 02:21:08 +0100
committerAmos Onn <amosonn@gmail.com>2017-02-16 03:20:49 +0100
commita2d176e8f4774b84db22540a45eed7b29482f154 (patch)
treed706dd04c3d8c3ddefb1ee1e478528a8696740c6 /src/libstd
parentab57e7b86817b8ca9b7e6afb2f689ae67274ec7c (diff)
downloadrust-a2d176e8f4774b84db22540a45eed7b29482f154.tar.gz
rust-a2d176e8f4774b84db22540a45eed7b29482f154.zip
std::io::cursor: Fixed Seek so test passes.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/io/cursor.rs22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/libstd/io/cursor.rs b/src/libstd/io/cursor.rs
index 9427e4afa21..60767ea4786 100644
--- a/src/libstd/io/cursor.rs
+++ b/src/libstd/io/cursor.rs
@@ -200,18 +200,20 @@ impl<T> Cursor<T> {
 #[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"))
         }
     }
 }