Skip to content

Commit a2d176e

Browse files
committed
std::io::cursor: Fixed Seek so test passes.
1 parent ab57e7b commit a2d176e

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

Diff for: src/libstd/io/cursor.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -200,18 +200,20 @@ impl<T> Cursor<T> {
200200
#[stable(feature = "rust1", since = "1.0.0")]
201201
impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> {
202202
fn seek(&mut self, style: SeekFrom) -> io::Result<u64> {
203-
let pos = match style {
204-
SeekFrom::Start(n) => { self.pos = n; return Ok(n) }
205-
SeekFrom::End(n) => self.inner.as_ref().len() as i64 + n,
206-
SeekFrom::Current(n) => self.pos as i64 + n,
203+
let (base_pos, offset) = match style {
204+
SeekFrom::Start(n) => { self.pos = n; return Ok(n); }
205+
SeekFrom::End(n) => (self.inner.as_ref().len() as u64, n),
206+
SeekFrom::Current(n) => (self.pos, n),
207207
};
208-
209-
if pos < 0 {
210-
Err(Error::new(ErrorKind::InvalidInput,
211-
"invalid seek to a negative position"))
208+
let new_pos = if offset >= 0 {
209+
base_pos.checked_add(offset as u64)
212210
} else {
213-
self.pos = pos as u64;
214-
Ok(self.pos)
211+
base_pos.checked_sub((offset.wrapping_neg()) as u64)
212+
};
213+
match new_pos {
214+
Some(n) => {self.pos = n; Ok(self.pos)}
215+
None => Err(Error::new(ErrorKind::InvalidInput,
216+
"invalid seek to a negative or overflowing position"))
215217
}
216218
}
217219
}

0 commit comments

Comments
 (0)