diff options
| -rw-r--r-- | src/binary/reader.rs | 22 | ||||
| -rw-r--r-- | src/lib.rs | 21 | ||||
| -rw-r--r-- | src/xml/reader.rs | 7 | ||||
| -rw-r--r-- | src/xml/writer.rs | 11 | 
4 files changed, 32 insertions, 29 deletions
| diff --git a/src/binary/reader.rs b/src/binary/reader.rs index 2463be2..3999d83 100644 --- a/src/binary/reader.rs +++ b/src/binary/reader.rs @@ -1,8 +1,7 @@ -use byteorder::{BigEndian, ReadBytesExt}; -use byteorder::Error as ByteorderError; +use byteorder::{BigEndian, Error as ByteorderError, ReadBytesExt};  use chrono::{TimeZone, UTC};  use std::io::{Cursor, Read, Seek, SeekFrom}; -use std::string::FromUtf16Error; +use std::string::{FromUtf8Error, FromUtf16Error};  use {Error, Result, PlistEvent, u64_to_usize}; @@ -15,6 +14,12 @@ impl From<ByteorderError> for Error {      }  } +impl From<FromUtf8Error> for Error { +    fn from(_: FromUtf8Error) -> Error { +        Error::InvalidData +    } +} +  impl From<FromUtf16Error> for Error {      fn from(_: FromUtf16Error) -> Error {          Error::InvalidData @@ -57,8 +62,9 @@ impl<R: Read + Seek> EventReader<R> {          try!(self.reader.seek(SeekFrom::Start(0)));          let mut magic = [0; 8];          try!(self.reader.read(&mut magic)); -        assert_eq!(&magic, b"bplist00"); - +        if &magic != b"bplist00" { +            return Err(Error::InvalidData); +        }          // Trailer starts with 6 bytes of padding          try!(self.reader.seek(SeekFrom::End(-32 + 6))); @@ -103,8 +109,8 @@ impl<R: Read + Seek> EventReader<R> {      }      fn read_object_len(&mut self, len: u8) -> Result<u64> { -        if (len & 0xf) == 0xf { -            let len_power_of_two = try!(self.reader.read_u8()) & 0x3; +        if (len & 0x0f) == 0x0f { +            let len_power_of_two = try!(self.reader.read_u8()) & 0x03;              Ok(match len_power_of_two {                  0 => try!(self.reader.read_u8()) as u64,                  1 => try!(self.reader.read_u16::<BigEndian>()) as u64, @@ -214,7 +220,7 @@ impl<R: Read + Seek> EventReader<R> {                  // ASCII string                  let len = try!(self.read_object_len(n));                  let raw = try!(self.read_data(len)); -                let string = String::from_utf8(raw).unwrap(); +                let string = try!(String::from_utf8(raw));                  Some(PlistEvent::StringValue(string))              }              (0x6, n) => { @@ -52,9 +52,9 @@ pub use de::{Deserializer, DeserializeError};  pub use ser::Serializer;  use chrono::{DateTime, UTC}; -use chrono::format::ParseError as ChronoParseError;  use serde::{Deserialize, Serialize};  use std::collections::BTreeMap; +use std::fmt;  use std::io::{Read, Seek, SeekFrom, Write};  use std::io::Error as IoError; @@ -211,8 +211,6 @@ impl ::std::error::Error for Error {      }  } -use std::fmt; -  impl fmt::Display for Error {      fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {          match *self { @@ -228,23 +226,6 @@ impl From<IoError> for Error {      }  } -impl From<ChronoParseError> for Error { -    fn from(_: ChronoParseError) -> Error { -        Error::InvalidData -    } -} - -use xml_rs::writer::Error as XmlWriterError; - -impl From<XmlWriterError> for Error { -    fn from(err: XmlWriterError) -> Error { -        match err { -            XmlWriterError::Io(err) => Error::Io(err), -            _ => Error::InvalidData, -        } -    } -} -  pub struct EventReader<R: Read + Seek>(EventReaderInner<R>);  enum EventReaderInner<R: Read + Seek> { diff --git a/src/xml/reader.rs b/src/xml/reader.rs index 9f57ab4..82d1be5 100644 --- a/src/xml/reader.rs +++ b/src/xml/reader.rs @@ -1,4 +1,5 @@  use chrono::{DateTime, UTC}; +use chrono::format::ParseError as ChronoParseError;  use rustc_serialize::base64::FromBase64;  use std::io::Read;  use std::str::FromStr; @@ -6,6 +7,12 @@ use xml_rs::reader::{EventReader as XmlEventReader, ParserConfig, XmlEvent};  use {Error, Result, PlistEvent}; +impl From<ChronoParseError> for Error { +    fn from(_: ChronoParseError) -> Error { +        Error::InvalidData +    } +} +  pub struct EventReader<R: Read> {      xml_reader: XmlEventReader<R>,      queued_event: Option<XmlEvent>, diff --git a/src/xml/writer.rs b/src/xml/writer.rs index 2442658..d165f2c 100644 --- a/src/xml/writer.rs +++ b/src/xml/writer.rs @@ -4,11 +4,20 @@ use std::io::Write;  use xml_rs::attribute::Attribute;  use xml_rs::name::Name;  use xml_rs::namespace::Namespace; -use xml_rs::writer::{EventWriter as XmlEventWriter, EmitterConfig}; +use xml_rs::writer::{Error as XmlWriterError, EventWriter as XmlEventWriter, EmitterConfig};  use xml_rs::writer::events::XmlEvent as WriteXmlEvent;  use {Error, EventWriter as PlistEventWriter, PlistEvent, Result}; +impl From<XmlWriterError> for Error { +    fn from(err: XmlWriterError) -> Error { +        match err { +            XmlWriterError::Io(err) => Error::Io(err), +            _ => Error::InvalidData, +        } +    } +} +  enum Element {      Dictionary(DictionaryState),      Array, | 
