Skip to content

Commit 93b74d6

Browse files
authored
Merge pull request #145 from multiformats/feat/no-alloc
fix: avoid allocating when decoding
2 parents 688a0c3 + 121345d commit 93b74d6

File tree

1 file changed

+12
-24
lines changed

1 file changed

+12
-24
lines changed

src/multihash.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use crate::hasher::{Digest, Size};
22
use crate::Error;
3-
#[cfg(all(not(feature = "std"), feature = "scale-codec"))]
4-
use alloc::vec;
53
use core::convert::TryFrom;
64
#[cfg(feature = "std")]
75
use core::convert::TryInto;
@@ -207,18 +205,13 @@ impl parity_scale_codec::Decode for Multihash<crate::U32> {
207205
) -> Result<Self, parity_scale_codec::Error> {
208206
let code = parity_scale_codec::Decode::decode(input)?;
209207
let size = parity_scale_codec::Decode::decode(input)?;
208+
if size > 32 {
209+
return Err(parity_scale_codec::Error::from("invalid size"));
210+
}
210211
// For a valid multihash, the length of digest must equal to the size.
211-
let mut buf = vec![0u8; size as usize];
212-
input.read(&mut buf)?;
213-
Ok(Multihash {
214-
code,
215-
size,
216-
digest: {
217-
let mut digest = [0u8; 32];
218-
digest[..size as usize].copy_from_slice(&buf);
219-
GenericArray::clone_from_slice(&digest)
220-
},
221-
})
212+
let mut digest = GenericArray::default();
213+
input.read(&mut digest[..size as usize])?;
214+
Ok(Multihash { code, size, digest })
222215
}
223216
}
224217

@@ -248,18 +241,13 @@ impl parity_scale_codec::Decode for Multihash<crate::U64> {
248241
) -> Result<Self, parity_scale_codec::Error> {
249242
let code = parity_scale_codec::Decode::decode(input)?;
250243
let size = parity_scale_codec::Decode::decode(input)?;
244+
if size > 64 {
245+
return Err(parity_scale_codec::Error::from("invalid size"));
246+
}
251247
// For a valid multihash, the length of digest must equal to the size.
252-
let mut buf = vec![0u8; size as usize];
253-
input.read(&mut buf)?;
254-
Ok(Multihash {
255-
code,
256-
size,
257-
digest: {
258-
let mut digest = [0u8; 64];
259-
digest[..size as usize].copy_from_slice(&buf);
260-
GenericArray::clone_from_slice(&digest)
261-
},
262-
})
248+
let mut digest = GenericArray::default();
249+
input.read(&mut digest[..size as usize])?;
250+
Ok(Multihash { code, size, digest })
263251
}
264252
}
265253

0 commit comments

Comments
 (0)