|
1 | 1 | use crate::hasher::{Digest, Size};
|
2 | 2 | use crate::Error;
|
3 |
| -#[cfg(all(not(feature = "std"), feature = "scale-codec"))] |
4 |
| -use alloc::vec; |
5 | 3 | use core::convert::TryFrom;
|
6 | 4 | #[cfg(feature = "std")]
|
7 | 5 | use core::convert::TryInto;
|
@@ -207,18 +205,13 @@ impl parity_scale_codec::Decode for Multihash<crate::U32> {
|
207 | 205 | ) -> Result<Self, parity_scale_codec::Error> {
|
208 | 206 | let code = parity_scale_codec::Decode::decode(input)?;
|
209 | 207 | let size = parity_scale_codec::Decode::decode(input)?;
|
| 208 | + if size > 32 { |
| 209 | + return Err(parity_scale_codec::Error::from("invalid size")); |
| 210 | + } |
210 | 211 | // 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 }) |
222 | 215 | }
|
223 | 216 | }
|
224 | 217 |
|
@@ -248,18 +241,13 @@ impl parity_scale_codec::Decode for Multihash<crate::U64> {
|
248 | 241 | ) -> Result<Self, parity_scale_codec::Error> {
|
249 | 242 | let code = parity_scale_codec::Decode::decode(input)?;
|
250 | 243 | let size = parity_scale_codec::Decode::decode(input)?;
|
| 244 | + if size > 64 { |
| 245 | + return Err(parity_scale_codec::Error::from("invalid size")); |
| 246 | + } |
251 | 247 | // 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 }) |
263 | 251 | }
|
264 | 252 | }
|
265 | 253 |
|
|
0 commit comments