From 3610b6f31c082c07c3dda087bc61b480cdf024fc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 3 Feb 2021 03:09:27 +0000 Subject: [PATCH] cli: Don't overallocate upgradeable program if --final specified (#15011) (#15027) (cherry picked from commit a1b9e00c1480be32727630d45164ff4f6bf3b043) Co-authored-by: Jack May --- cli/src/program.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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)?, )?;