From ba8cf66f610dc88a047118b5dafbb2d1d324ac92 Mon Sep 17 00:00:00 2001 From: Iamsohungrynow <261225237+Iamsohungrynow@users.noreply.github.com> Date: Sat, 24 Oct 2026 03:37:41 +0800 Subject: [PATCH] tlv-account-resolution: return the unpack error in init and update ExtraAccountMetaList::init and update return a Result but still unwrapped TlvStateMut::unpack, so data too short for a TLV header panicked instead of returning InvalidAccountData. #207 fixed the same thing in the read paths. --- tlv-account-resolution/src/state.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tlv-account-resolution/src/state.rs b/tlv-account-resolution/src/state.rs index 0747181..eef9a82 100644 --- a/tlv-account-resolution/src/state.rs +++ b/tlv-account-resolution/src/state.rs @@ -156,7 +156,7 @@ impl ExtraAccountMetaList { data: &mut [u8], extra_account_metas: &[ExtraAccountMeta], ) -> Result<(), ProgramError> { - let mut state = TlvStateMut::unpack(data).unwrap(); + let mut state = TlvStateMut::unpack(data)?; let tlv_size = ListView::::size_of(extra_account_metas.len())?; let (bytes, _) = state.alloc::(tlv_size, false)?; let mut validation_data = ListView::::init(bytes)?; @@ -172,7 +172,7 @@ impl ExtraAccountMetaList { data: &mut [u8], extra_account_metas: &[ExtraAccountMeta], ) -> Result<(), ProgramError> { - let mut state = TlvStateMut::unpack(data).unwrap(); + let mut state = TlvStateMut::unpack(data)?; let tlv_size = ListView::::size_of(extra_account_metas.len())?; let bytes = state.realloc_first::(tlv_size)?; let mut validation_data = ListView::::init(bytes)?; @@ -1761,4 +1761,23 @@ mod tests { "corrupt validation data must error, not panic" ); } + + #[test] + fn init_and_update_with_malformed_data_error() { + let required_accounts = + [ExtraAccountMeta::new_with_pubkey(&Pubkey::new_unique(), false, true).unwrap()]; + + // Too short for a TLV header, so the unpack fails. + let mut buffer = vec![1u8; 4]; + assert_eq!( + ExtraAccountMetaList::init::(&mut buffer, &required_accounts) + .unwrap_err(), + ProgramError::InvalidAccountData, + ); + assert_eq!( + ExtraAccountMetaList::update::(&mut buffer, &required_accounts) + .unwrap_err(), + ProgramError::InvalidAccountData, + ); + } }