Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update packable dependency version to 0.3.1 and move trailing bytes check outsite of unpack #1350

Merged
merged 5 commits into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion bee-api/bee-rest-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ iota-crypto = { version = "0.9.1", default-features = false, features = [ "blake
log = { version = "0.4.14", default-features = false, optional = true }
multiaddr = { version = "0.13.0", default-features = false }
num_cpus = { version = "1.13.0", default-features = false, optional = true }
packable = { version = "0.3.0", default-features = false }
packable = { version = "0.3.1", default-features = false }
prefix-hex = { version = "0.2.0", default-features = false }
primitive-types = { version = "0.10.1", default-features = false, features = [ "serde" ] }
serde = { version = "1.0.130", default-features = false, features = [ "derive" ] }
Expand Down
2 changes: 1 addition & 1 deletion bee-ledger/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ futures = { version = "0.3.17", default-features = false, optional = true }
hashbrown = { version = "0.12.0", default-features = false, optional = true }
iota-crypto = { version = "0.9.1", default-features = false, features = [ "blake2b" ], optional = true }
log = { version = "0.4.14", default-features = false, optional = true }
packable = { version = "0.3.0", default-features = false, features = [ "serde", "io" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde", "io" ] }
prefix-hex = { version = "0.2.0", default-features = false, optional = true }
ref-cast = { version = "1.0.6", default-features = false, optional = true }
reqwest = { version = "0.11.5", default-features = false, features = [ "default-tls", "stream" ], optional = true }
Expand Down
2 changes: 1 addition & 1 deletion bee-message/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ hashbrown = { version = "0.12.0", default-features = false, features = [ "ahash"
hex = { version = "0.4.3", default-features = false, features = [ "alloc" ] }
iota-crypto = { version = "0.9.1", default-features = false, features = [ "ed25519", "blake2b" ] }
iterator-sorted = { version = "0.1.0", default-features = false }
packable = { version = "0.3.0", default-features = false, features = [ "serde", "primitive-types" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde", "primitive-types" ] }
prefix-hex = { version = "0.2.0", default-features = false, features = [ "primitive-types1" ] }
primitive-types = { version = "0.10.1", default-features = false, features = [ "serde" ] }
serde = { version = "1.0.130", default-features = false, optional = true }
Expand Down
2 changes: 1 addition & 1 deletion bee-message/fuzz/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ cargo-fuzz = true
bee-message = { path = "..", default-features = false }

libfuzzer-sys = { version = "0.4.2", default-features = false }
packable = { version = "0.3.0", default-features = false }
packable = { version = "0.3.1", default-features = false }

# Prevent this from interfering with workspaces
[workspace]
Expand Down
2 changes: 1 addition & 1 deletion bee-message/fuzz/fuzz_targets/fuzz_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ use libfuzzer_sys::fuzz_target;
use packable::PackableExt;

fuzz_target!(|data: &[u8]| {
let _ = Message::unpack_verified(&mut data.to_vec().as_slice());
let _ = Message::unpack_strict(&mut data.to_vec().as_slice());
});
2 changes: 1 addition & 1 deletion bee-message/fuzz/src/fuzz_sorter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fn main() -> io::Result<()> {

file.read_to_end(&mut buffer)?;

if let Err(err) = Message::unpack_verified(&mut buffer.as_slice()) {
if let Err(err) = Message::unpack_strict(&mut buffer.as_slice()) {
if !matches!(err, UnpackError::Unpacker(..)) {
let mut file = OpenOptions::new()
.write(true)
Expand Down
39 changes: 27 additions & 12 deletions bee-message/src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use core::ops::Deref;
use bee_pow::providers::{miner::Miner, NonceProvider, NonceProviderBuilder};
use crypto::hashes::{blake2b::Blake2b256, Digest};
use packable::{
error::{UnpackError, UnpackErrorExt},
error::{UnexpectedEOF, UnpackError, UnpackErrorExt},
packer::Packer,
unpacker::{CounterUnpacker, Unpacker},
Packable, PackableExt,
Expand Down Expand Up @@ -148,6 +148,22 @@ impl Message {
pub fn into_parents(self) -> Parents {
self.parents
}

/// Unpacks a [`Message`] from a sequence of bytes doing syntactical checks and verifying that
/// there are no trailing bytes in the sequence.
pub fn unpack_strict<T: AsRef<[u8]>>(
bytes: T,
) -> Result<Self, UnpackError<<Self as Packable>::UnpackError, UnexpectedEOF>> {
let mut unpacker = CounterUnpacker::new(bytes.as_ref());
let message = Self::unpack::<_, true>(&mut unpacker)?;

// When parsing the message is complete, there should not be any trailing bytes left that were not parsed.
if u8::unpack::<_, true>(&mut unpacker).is_ok() {
return Err(UnpackError::Packable(Error::RemainingBytesAfterMessage));
}

Ok(message)
}
}

impl Packable for Message {
Expand All @@ -165,9 +181,9 @@ impl Packable for Message {
fn unpack<U: Unpacker, const VERIFY: bool>(
unpacker: &mut U,
) -> Result<Self, UnpackError<Self::UnpackError, U::Error>> {
let mut unpacker = CounterUnpacker::new(unpacker);
let start_opt = unpacker.read_bytes();

let protocol_version = u8::unpack::<_, VERIFY>(&mut unpacker).coerce()?;
let protocol_version = u8::unpack::<_, VERIFY>(unpacker).coerce()?;

if VERIFY && protocol_version != PROTOCOL_VERSION {
return Err(UnpackError::Packable(Error::ProtocolVersionMismatch {
Expand All @@ -176,19 +192,14 @@ impl Packable for Message {
}));
}

let parents = Parents::unpack::<_, VERIFY>(&mut unpacker)?;
let payload = OptionalPayload::unpack::<_, VERIFY>(&mut unpacker)?;
let parents = Parents::unpack::<_, VERIFY>(unpacker)?;
let payload = OptionalPayload::unpack::<_, VERIFY>(unpacker)?;

if VERIFY {
verify_payload(payload.deref().as_ref()).map_err(UnpackError::Packable)?;
}

let nonce = u64::unpack::<_, VERIFY>(&mut unpacker).coerce()?;

// When parsing the message is complete, there should not be any trailing bytes left that were not parsed.
if VERIFY && u8::unpack::<_, VERIFY>(&mut unpacker).is_ok() {
return Err(UnpackError::Packable(Error::RemainingBytesAfterMessage));
}
let nonce = u64::unpack::<_, VERIFY>(unpacker).coerce()?;

let message = Self {
protocol_version,
Expand All @@ -197,7 +208,11 @@ impl Packable for Message {
nonce,
};

let message_len = unpacker.counter();
let message_len = if let (Some(start), Some(end)) = (start_opt, unpacker.read_bytes()) {
pvdrz marked this conversation as resolved.
Show resolved Hide resolved
end - start
} else {
message.packed_len()
};

if VERIFY && message_len > Message::LENGTH_MAX {
return Err(UnpackError::Packable(Error::InvalidMessageLength(message_len)));
Expand Down
9 changes: 8 additions & 1 deletion bee-message/src/payload/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,15 @@ impl Packable for OptionalPayload {
if len > 0 {
unpacker.ensure_bytes(len)?;

let start_opt = unpacker.read_bytes();

let payload = Payload::unpack::<_, VERIFY>(unpacker)?;
let actual_len = payload.packed_len();

let actual_len = if let (Some(start), Some(end)) = (start_opt, unpacker.read_bytes()) {
end - start
} else {
payload.packed_len()
};

if len != actual_len {
Err(UnpackError::Packable(Error::InvalidPayloadLength {
Expand Down
4 changes: 2 additions & 2 deletions bee-message/tests/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ fn invalid_payload_kind() {
#[test]
fn unpack_valid_no_remaining_bytes() {
assert!(
Message::unpack_verified(
Message::unpack_strict(
&mut vec![
2, 2, 140, 28, 186, 52, 147, 145, 96, 9, 105, 89, 78, 139, 3, 71, 249, 97, 149, 190, 63, 238, 168, 202,
82, 140, 227, 66, 173, 19, 110, 93, 117, 34, 225, 202, 251, 10, 156, 58, 144, 225, 54, 79, 62, 38, 20,
Expand All @@ -87,7 +87,7 @@ fn unpack_valid_no_remaining_bytes() {
#[test]
fn unpack_invalid_remaining_bytes() {
assert!(matches!(
Message::unpack_verified(
Message::unpack_strict(
&mut vec![
2, 2, 140, 28, 186, 52, 147, 145, 96, 9, 105, 89, 78, 139, 3, 71, 249, 97, 149, 190, 63, 238, 168, 202,
82, 140, 227, 66, 173, 19, 110, 93, 117, 34, 225, 202, 251, 10, 156, 58, 144, 225, 54, 79, 62, 38, 20,
Expand Down
2 changes: 1 addition & 1 deletion bee-node/bee-node/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ hex = { version = "0.4.3", default-features = false }
iota-crypto = { version = "0.9.1", default-features = false, features = [ "ed25519", "random", "blake2b" ] }
log = { version = "0.4.14", default-features = false }
multiaddr = { version = "0.13.0", default-features = false }
packable = { version = "0.3.0", default-features = false, features = [ "io" ] }
packable = { version = "0.3.1", default-features = false, features = [ "io" ] }
pkcs8 = { version = "0.8.0", default-features = false, features = [ "alloc", "pem", "std" ] }
rand = { version = "0.8.4", default-features = false }
rpassword = { version = "5.0.1", default-features = false }
Expand Down
2 changes: 1 addition & 1 deletion bee-protocol/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fxhash = { version = "0.2.1", default-features = false, optional = true }
hex = { version = "0.4.3", default-features = false, optional = true }
log = { version = "0.4.14", default-features = false, optional = true }
num_cpus = { version = "1.13.0", default-features = false, optional = true }
packable = { version = "0.3.0", default-features = false }
packable = { version = "0.3.1", default-features = false }
parking_lot = { version = "0.12.0", default-features = false, optional = true }
rand = { version = "0.8.5", default-features = false, optional = true }
ref-cast = { version = "1.0.6", default-features = false, optional = true }
Expand Down
3 changes: 1 addition & 2 deletions bee-protocol/src/workers/message/processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ use bee_runtime::{node::Node, shutdown_stream::ShutdownStream, worker::Worker};
use bee_tangle::{metadata::MessageMetadata, Tangle, TangleWorker};
use futures::{channel::oneshot::Sender, stream::StreamExt};
use log::{error, info, trace};
use packable::PackableExt;
use tokio::sync::mpsc;
use tokio_stream::wrappers::UnboundedReceiverStream;

Expand Down Expand Up @@ -119,7 +118,7 @@ where
{
trace!("Processing received message...");

let message = match Message::unpack_verified(&mut &message_packet.bytes[..]) {
let message = match Message::unpack_strict(&mut &message_packet.bytes[..]) {
Ok(message) => message,
Err(e) => {
notify_invalid_message(format!("Invalid message: {:?}.", e), &metrics, notifier);
Expand Down
2 changes: 1 addition & 1 deletion bee-storage/bee-storage-rocksdb/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ bee-storage = { version = "0.9.0", path = "../bee-storage", default-features = f
bee-tangle = { version = "0.3.0", path = "../../bee-tangle", default-features = false }

num_cpus = { version = "1.13.0", default-features = false }
packable = { version = "0.3.0", default-features = false, features = [ "serde" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde" ] }
rocksdb = { version = "0.18.0", default-features = false }
serde = { version = "1.0.130", default-features = false, features = [ "derive" ] }
thiserror = { version = "1.0.30", default-features = false }
Expand Down
2 changes: 1 addition & 1 deletion bee-storage/bee-storage-sled/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ bee-storage = { version = "0.9.0", path = "../bee-storage", default-features = f
bee-tangle = { version = "0.3.0", path = "../../bee-tangle", default-features = false }

num_cpus = { version = "1.13.0", default-features = false }
packable = { version = "0.3.0", default-features = false, features = [ "serde" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde" ] }
serde = { version = "1.0.130", default-features = false, features = [ "derive" ] }
sled = { version = "0.34.7", default-features = false, features = [ "compression" ]}
thiserror = "1.0.30"
Expand Down
2 changes: 1 addition & 1 deletion bee-storage/bee-storage-test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ bee-storage = { version = "0.9.0", path = "../bee-storage", default-features = f
bee-tangle = { version = "0.3.0", path = "../../bee-tangle", default-features = false }
bee-test = { version = "0.1.0", path = "../../bee-test", default-features = false }

packable = { version = "0.3.0", default-features = false, features = [ "serde" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde" ] }
2 changes: 1 addition & 1 deletion bee-storage/bee-storage/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ all-features = true
rustdoc-args = [ "--cfg", "doc_cfg" ]

[dependencies]
packable = { version = "0.3.0", default-features = false, features = [ "serde" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde" ] }
serde = { version = "1.0.130", features = [ "derive" ], default-features = false }
thiserror = { version = "1.0.30", default-features = false }
2 changes: 1 addition & 1 deletion bee-tangle/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ bitflags = { version = "1.2.1", default-features = false }
futures = { version = "0.3.17", default-features = false }
hashbrown = { version = "0.12.0", default-features = false, features = [ "raw", "ahash" ] }
log = { version = "0.4.14", default-features = false }
packable = { version = "0.3.0", default-features = false, features = [ "serde" ] }
packable = { version = "0.3.1", default-features = false, features = [ "serde" ] }
rand = { version = "0.8.5", default-features = false, features = [ "std", "std_rng" ] }
ref-cast = { version = "1.0.6", default-features = false }
serde = { version = "1.0.130", default-features = false, features = [ "derive" ] }
Expand Down