diff --git a/ciborium/Cargo.toml b/ciborium/Cargo.toml index 9e575ab..dcb878b 100644 --- a/ciborium/Cargo.toml +++ b/ciborium/Cargo.toml @@ -21,8 +21,8 @@ is-it-maintained-open-issues = { repository = "enarx/ciborium" } [dependencies] ciborium-ll = { path = "../ciborium-ll", version = "0.2.0" } -ciborium-io = { path = "../ciborium-io", version = "0.2.0", features = ["alloc"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } +ciborium-io = { path = "../ciborium-io", version = "0.2.0" } +serde = { version = "1.0", default-features = false, features = ["derive"] } [dev-dependencies] serde_bytes = "0.11" @@ -31,5 +31,6 @@ rand = "0.8" hex = "0.4" [features] -default = ["std"] +default = ["std", "alloc"] +alloc = ["ciborium-io/alloc", "serde/alloc"] std = ["ciborium-io/std", "serde/std"] diff --git a/ciborium/src/de/mod.rs b/ciborium/src/de/mod.rs index 15545b4..0160306 100644 --- a/ciborium/src/de/mod.rs +++ b/ciborium/src/de/mod.rs @@ -136,15 +136,25 @@ where Err(..) => self.deserialize_i128(visitor), }, - Header::Bytes(len) => match len { - Some(len) if len <= self.scratch.len() => self.deserialize_bytes(visitor), - _ => self.deserialize_byte_buf(visitor), - }, + Header::Bytes(len) => { + #[cfg(not(feature = "alloc"))] + match len { + Some(len) if len <= self.scratch.len() => self.deserialize_bytes(visitor), + _ => self.deserialize_byte_buf(visitor), + } + #[cfg(feature = "alloc")] + self.deserialize_byte_buf(visitor) + } - Header::Text(len) => match len { - Some(len) if len <= self.scratch.len() => self.deserialize_str(visitor), - _ => self.deserialize_string(visitor), - }, + Header::Text(len) => { + #[cfg(not(feature = "alloc"))] + match len { + Some(len) if len <= self.scratch.len() => self.deserialize_str(visitor), + _ => self.deserialize_string(visitor), + } + #[cfg(feature = "alloc")] + self.deserialize_string(visitor) + } Header::Array(..) => self.deserialize_seq(visitor), Header::Map(..) => self.deserialize_map(visitor), @@ -324,7 +334,12 @@ where return match self.decoder.pull()? { Header::Tag(..) => continue, - Header::Text(Some(len)) if len <= self.scratch.len() => { + Header::Text(Some(len)) => { + #[cfg(not(feature = "alloc"))] + if len > self.scratch.len() { + return Err(Error::Syntax(offset)); + } + self.decoder.read_exact(&mut self.scratch[..len])?; match core::str::from_utf8(&self.scratch[..len]) { @@ -363,10 +378,17 @@ where fn deserialize_bytes>(self, visitor: V) -> Result { loop { + let offset = self.decoder.offset(); + return match self.decoder.pull()? { Header::Tag(..) => continue, - Header::Bytes(Some(len)) if len <= self.scratch.len() => { + Header::Bytes(Some(len)) => { + #[cfg(not(feature = "alloc"))] + if len > self.scratch.len() { + return Err(Error::Syntax(offset)); + } + self.decoder.read_exact(&mut self.scratch[..len])?; visitor.visit_bytes(&self.scratch[..len]) } @@ -803,7 +825,10 @@ pub fn from_reader<'de, T: de::Deserialize<'de>, R: Read>(reader: R) -> Result, R: Read>( + reader: R, + buf: &mut [u8], +) -> Result> +where + R::Error: core::fmt::Debug, +{ + let mut reader = Deserializer { + decoder: reader.into(), + scratch: buf, + recurse: 256, + }; + + T::deserialize(&mut reader) +}