|
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