aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/binary/reader.rs22
-rw-r--r--src/lib.rs21
-rw-r--r--src/xml/reader.rs7
-rw-r--r--src/xml/writer.rs11
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) => {
diff --git a/src/lib.rs b/src/lib.rs
index ccdf5c6..ddd2270 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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,