(cherry picked from commit 2409bb18f3)
Co-authored-by: Jack May <jack@solana.com>
			
			
This commit is contained in:
		@@ -85,33 +85,41 @@ pub fn serialize_parameters_unaligned(
 | 
			
		||||
    let mut v: Vec<u8> = Vec::with_capacity(size);
 | 
			
		||||
 | 
			
		||||
    v.write_u64::<LittleEndian>(keyed_accounts.len() as u64)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    for (i, keyed_account) in keyed_accounts.iter().enumerate() {
 | 
			
		||||
        let (is_dup, position) = is_dup(&keyed_accounts[..i], keyed_account);
 | 
			
		||||
        if is_dup {
 | 
			
		||||
            v.write_u8(position as u8).unwrap();
 | 
			
		||||
            v.write_u8(position as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
        } else {
 | 
			
		||||
            v.write_u8(std::u8::MAX).unwrap();
 | 
			
		||||
            v.write_u8(std::u8::MAX)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.signer_key().is_some() as u8)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
            v.write_u8(keyed_account.is_writable() as u8).unwrap();
 | 
			
		||||
            v.write_all(keyed_account.unsigned_key().as_ref()).unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.is_writable() as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(keyed_account.unsigned_key().as_ref())
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.lamports()?)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.data_len()? as u64)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(&keyed_account.try_account_ref()?.data())
 | 
			
		||||
                .unwrap();
 | 
			
		||||
            v.write_all(keyed_account.owner()?.as_ref()).unwrap();
 | 
			
		||||
            v.write_u8(keyed_account.executable()? as u8).unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(keyed_account.owner()?.as_ref())
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.executable()? as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.rent_epoch()? as u64)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    v.write_u64::<LittleEndian>(instruction_data.len() as u64)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    v.write_all(instruction_data).unwrap();
 | 
			
		||||
    v.write_all(program_id.as_ref()).unwrap();
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    v.write_all(instruction_data)
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    v.write_all(program_id.as_ref())
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    Ok(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -193,30 +201,38 @@ pub fn serialize_parameters_aligned(
 | 
			
		||||
 | 
			
		||||
    // Serialize into the buffer
 | 
			
		||||
    v.write_u64::<LittleEndian>(keyed_accounts.len() as u64)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    if v.as_ptr().align_offset(align_of::<u128>()) != 0 {
 | 
			
		||||
        panic!();
 | 
			
		||||
    }
 | 
			
		||||
    for (i, keyed_account) in keyed_accounts.iter().enumerate() {
 | 
			
		||||
        let (is_dup, position) = is_dup(&keyed_accounts[..i], keyed_account);
 | 
			
		||||
        if is_dup {
 | 
			
		||||
            v.write_u8(position as u8).unwrap();
 | 
			
		||||
            v.write_all(&[0u8, 0, 0, 0, 0, 0, 0]).unwrap(); // 7 bytes of padding to make 64-bit aligned
 | 
			
		||||
            v.write_u8(position as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(&[0u8, 0, 0, 0, 0, 0, 0])
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?; // 7 bytes of padding to make 64-bit aligned
 | 
			
		||||
        } else {
 | 
			
		||||
            v.write_u8(std::u8::MAX).unwrap();
 | 
			
		||||
            v.write_u8(std::u8::MAX)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.signer_key().is_some() as u8)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
            v.write_u8(keyed_account.is_writable() as u8).unwrap();
 | 
			
		||||
            v.write_u8(keyed_account.executable()? as u8).unwrap();
 | 
			
		||||
            v.write_all(&[0u8, 0, 0, 0]).unwrap(); // 4 bytes of padding to make 128-bit aligned
 | 
			
		||||
            v.write_all(keyed_account.unsigned_key().as_ref()).unwrap();
 | 
			
		||||
            v.write_all(keyed_account.owner()?.as_ref()).unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.is_writable() as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u8(keyed_account.executable()? as u8)
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(&[0u8, 0, 0, 0])
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?; // 4 bytes of padding to make 128-bit aligned
 | 
			
		||||
            v.write_all(keyed_account.unsigned_key().as_ref())
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(keyed_account.owner()?.as_ref())
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.lamports()?)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.data_len()? as u64)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.write_all(&keyed_account.try_account_ref()?.data())
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
            v.resize(
 | 
			
		||||
                v.len()
 | 
			
		||||
                    + MAX_PERMITTED_DATA_INCREASE
 | 
			
		||||
@@ -224,13 +240,15 @@ pub fn serialize_parameters_aligned(
 | 
			
		||||
                0,
 | 
			
		||||
            );
 | 
			
		||||
            v.write_u64::<LittleEndian>(keyed_account.rent_epoch()? as u64)
 | 
			
		||||
                .unwrap();
 | 
			
		||||
                .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    v.write_u64::<LittleEndian>(instruction_data.len() as u64)
 | 
			
		||||
        .unwrap();
 | 
			
		||||
    v.write_all(instruction_data).unwrap();
 | 
			
		||||
    v.write_all(program_id.as_ref()).unwrap();
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    v.write_all(instruction_data)
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    v.write_all(program_id.as_ref())
 | 
			
		||||
        .map_err(|_| InstructionError::InvalidArgument)?;
 | 
			
		||||
    Ok(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user