diff options
| author | Edward Barnard | 2015-12-30 17:21:28 +0100 |
|---|---|---|
| committer | Edward Barnard | 2015-12-30 17:21:28 +0100 |
| commit | bca7a4a2335a10c6fb86702593fb8ebbdd5d6c40 (patch) | |
| tree | 787fd7b846a83e641c3e2cd2fcc7aad2ca008b81 | |
| parent | 240d0ceeb7fa6d961dcae0cd3fe1682bb3bed891 (diff) | |
| download | rust-plist-bca7a4a2335a10c6fb86702593fb8ebbdd5d6c40.tar.bz2 | |
Improve error handling
| -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, |
