diff --git a/cli/src/program.rs b/cli/src/program.rs index e7a81b76ba..237315ee75 100644 --- a/cli/src/program.rs +++ b/cli/src/program.rs @@ -657,7 +657,7 @@ fn process_program_deploy( true }; - let (program_data, buffer_data_len) = if buffer_provided { + let (program_data, program_len) = if buffer_provided { // Check supplied buffer account if let Some(account) = rpc_client .get_account_with_commitment(&buffer_pubkey, config.commitment)? @@ -676,15 +676,21 @@ fn process_program_deploy( } } else if let Some(program_location) = program_location { let program_data = read_and_verify_elf(&program_location)?; - let buffer_data_len = if let Some(len) = max_len { - len - } else { - program_data.len() * 2 - }; - (program_data, buffer_data_len) + let program_len = program_data.len(); + (program_data, program_len) } else { return Err("Program location required if buffer not supplied".into()); }; + let buffer_data_len = if let Some(len) = max_len { + if program_len > len { + return Err("Max length specified not large enough".into()); + } + len + } else if is_final { + program_len + } else { + program_len * 2 + }; let minimum_balance = rpc_client.get_minimum_balance_for_rent_exemption( UpgradeableLoaderState::programdata_len(buffer_data_len)?, )?;