From 35ee8e80f25d852620061fc6e9627485467d12ea Mon Sep 17 00:00:00 2001 From: Edward Barnard Date: Fri, 25 Dec 2015 01:16:23 +0000 Subject: Better handling of u64 to usize conversions --- src/binary/reader.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'src/binary/reader.rs') diff --git a/src/binary/reader.rs b/src/binary/reader.rs index 0504e13..128c573 100644 --- a/src/binary/reader.rs +++ b/src/binary/reader.rs @@ -4,7 +4,7 @@ use chrono::{TimeZone, UTC}; use std::io::{Cursor, Read, Seek, SeekFrom}; use std::string::FromUtf16Error; -use {Error, Result, PlistEvent}; +use {Error, Result, PlistEvent, u64_to_usize}; impl From for Error { fn from(err: ByteorderError) -> Error { @@ -82,7 +82,8 @@ impl EventReader { } fn read_ints(&mut self, len: u64, size: u8) -> Result> { - let mut ints = Vec::with_capacity(len as usize); + let len = try!(u64_to_usize(len)); + let mut ints = Vec::with_capacity(len); // TODO: Is the match hoisted out of the loop? for _ in 0..len { match size { @@ -117,10 +118,11 @@ impl EventReader { } fn read_data(&mut self, len: u64) -> Result> { - let mut data = vec![0; len as usize]; - let mut total_read = 0usize; + let len = try!(u64_to_usize(len)); + let mut data = vec![0; len]; + let mut total_read = 0; - while (total_read as u64) < len { + while total_read < len { let read = try!(self.reader.read(&mut data[total_read..])); if read == 0 { return Err(Error::UnexpectedEof); @@ -132,7 +134,8 @@ impl EventReader { } fn seek_to_object(&mut self, object_ref: u64) -> Result { - let offset = *&self.object_offsets[object_ref as usize]; + let object_ref = try!(u64_to_usize(object_ref)); + let offset = *&self.object_offsets[object_ref]; let pos = try!(self.reader.seek(SeekFrom::Start(offset))); Ok(pos) } @@ -221,7 +224,8 @@ impl EventReader { let raw = try!(self.read_data(len)); let mut cursor = Cursor::new(raw); - let mut raw_utf16 = Vec::with_capacity(len as usize / 2); + let len_div_2 = try!(u64_to_usize(len / 2)); + let mut raw_utf16 = Vec::with_capacity(len_div_2); while cursor.position() < len { raw_utf16.push(try!(cursor.read_u16::())) } @@ -249,9 +253,10 @@ impl EventReader { let key_refs = try!(self.read_refs(len)); let value_refs = try!(self.read_refs(len)); - let len = len as usize; + let len_mul_2 = try!(u64_to_usize(len * 2)); + let len = try!(u64_to_usize(len)); - let mut object_refs = Vec::with_capacity(len * 2); + let mut object_refs = Vec::with_capacity(len_mul_2); for i in 1..len + 1 { // Reverse so we can pop off the end of the stack in order -- cgit v1.2.3