|
1 | 1 | #![allow(clippy::arithmetic_side_effects)]
|
2 | 2 |
|
3 | 3 | use {
|
4 |
| - byteorder::{ByteOrder, LittleEndian}, |
5 | 4 | solana_instruction::error::InstructionError,
|
6 | 5 | solana_program_entrypoint::{BPF_ALIGN_OF_U128, MAX_PERMITTED_DATA_INCREASE, NON_DUP_MARKER},
|
7 | 6 | solana_program_runtime::invoke_context::SerializedAccountMetadata,
|
@@ -379,11 +378,12 @@ fn deserialize_parameters_unaligned<I: IntoIterator<Item = usize>>(
|
379 | 378 | start += size_of::<u8>(); // is_signer
|
380 | 379 | start += size_of::<u8>(); // is_writable
|
381 | 380 | start += size_of::<Pubkey>(); // key
|
382 |
| - let lamports = LittleEndian::read_u64( |
383 |
| - buffer |
384 |
| - .get(start..) |
385 |
| - .ok_or(InstructionError::InvalidArgument)?, |
386 |
| - ); |
| 381 | + let lamports = buffer |
| 382 | + .get(start..start.saturating_add(8)) |
| 383 | + .map(<[u8; 8]>::try_from) |
| 384 | + .and_then(Result::ok) |
| 385 | + .map(u64::from_le_bytes) |
| 386 | + .ok_or(InstructionError::InvalidArgument)?; |
387 | 387 | if borrowed_account.get_lamports() != lamports {
|
388 | 388 | borrowed_account.set_lamports(lamports)?;
|
389 | 389 | }
|
@@ -527,20 +527,22 @@ fn deserialize_parameters_aligned<I: IntoIterator<Item = usize>>(
|
527 | 527 | .get(start..start + size_of::<Pubkey>())
|
528 | 528 | .ok_or(InstructionError::InvalidArgument)?;
|
529 | 529 | start += size_of::<Pubkey>(); // owner
|
530 |
| - let lamports = LittleEndian::read_u64( |
531 |
| - buffer |
532 |
| - .get(start..) |
533 |
| - .ok_or(InstructionError::InvalidArgument)?, |
534 |
| - ); |
| 530 | + let lamports = buffer |
| 531 | + .get(start..start.saturating_add(8)) |
| 532 | + .map(<[u8; 8]>::try_from) |
| 533 | + .and_then(Result::ok) |
| 534 | + .map(u64::from_le_bytes) |
| 535 | + .ok_or(InstructionError::InvalidArgument)?; |
535 | 536 | if borrowed_account.get_lamports() != lamports {
|
536 | 537 | borrowed_account.set_lamports(lamports)?;
|
537 | 538 | }
|
538 | 539 | start += size_of::<u64>(); // lamports
|
539 |
| - let post_len = LittleEndian::read_u64( |
540 |
| - buffer |
541 |
| - .get(start..) |
542 |
| - .ok_or(InstructionError::InvalidArgument)?, |
543 |
| - ) as usize; |
| 540 | + let post_len = buffer |
| 541 | + .get(start..start.saturating_add(8)) |
| 542 | + .map(<[u8; 8]>::try_from) |
| 543 | + .and_then(Result::ok) |
| 544 | + .map(u64::from_le_bytes) |
| 545 | + .ok_or(InstructionError::InvalidArgument)? as usize; |
544 | 546 | start += size_of::<u64>(); // data length
|
545 | 547 | if post_len.saturating_sub(pre_len) > MAX_PERMITTED_DATA_INCREASE
|
546 | 548 | || post_len > MAX_PERMITTED_DATA_LENGTH as usize
|
|
0 commit comments