diff --git a/src/dynamic_program.rs b/src/dynamic_program.rs index d056e3e154..ebf7435265 100644 --- a/src/dynamic_program.rs +++ b/src/dynamic_program.rs @@ -13,6 +13,7 @@ use libc; use libloading::os::unix::*; #[cfg(windows)] use libloading::os::windows::*; +use result::Result; use solana_program_interface::account::KeyedAccount; use solana_program_interface::pubkey::Pubkey; @@ -80,12 +81,12 @@ pub enum DynamicProgram { } impl DynamicProgram { - pub fn new_native(name: String) -> Self { + pub fn new_native(name: String) -> Result { // create native program let path = ProgramPath::Native {}.create(&name); // TODO linux tls bug can cause crash on dlclose, workaround by never unloading - let library = Library::open(Some(path), libc::RTLD_NODELETE | libc::RTLD_NOW).unwrap(); - DynamicProgram::Native { name, library } + let library = Library::open(Some(path), libc::RTLD_NODELETE | libc::RTLD_NOW)?; + Ok(DynamicProgram::Native { name, library }) } pub fn new_bpf_from_file(name: String) -> Self { diff --git a/src/system_program.rs b/src/system_program.rs index 5d94959c80..d33b621093 100644 --- a/src/system_program.rs +++ b/src/system_program.rs @@ -102,7 +102,13 @@ impl SystemProgram { } SystemProgram::Load { program_id, name } => { let mut hashmap = loaded_programs.write().unwrap(); - hashmap.insert(program_id, DynamicProgram::new_native(name)); + hashmap.insert( + program_id, + DynamicProgram::new_native(name).map_err(|err| { + warn!("SystemProgram::Load failure: {:?}", err); + Error::InvalidArgument + })?, + ); } } Ok(()) diff --git a/tests/programs.rs b/tests/programs.rs index 54efa63463..ae841e22b8 100644 --- a/tests/programs.rs +++ b/tests/programs.rs @@ -142,7 +142,7 @@ fn test_native_file_noop() { .map(|(key, account)| KeyedAccount { key, account }) .collect(); - let dp = DynamicProgram::new_native("noop".to_string()); + let dp = DynamicProgram::new_native("noop".to_string()).unwrap(); dp.call(&mut infos, &data); } } @@ -163,7 +163,7 @@ fn test_native_file_move_funds_success() { .map(|(key, account)| KeyedAccount { key, account }) .collect(); - let dp = DynamicProgram::new_native("move_funds".to_string()); + let dp = DynamicProgram::new_native("move_funds".to_string()).unwrap(); dp.call(&mut infos, &data); } assert_eq!(0, accounts[0].tokens); @@ -186,7 +186,7 @@ fn test_native_file_move_funds_insufficient_funds() { .map(|(key, account)| KeyedAccount { key, account }) .collect(); - let dp = DynamicProgram::new_native("move_funds".to_string()); + let dp = DynamicProgram::new_native("move_funds".to_string()).unwrap(); dp.call(&mut infos, &data); } assert_eq!(10, accounts[0].tokens); @@ -216,7 +216,7 @@ fn test_program_native_move_funds_succes_many_threads() { .map(|(key, account)| KeyedAccount { key, account }) .collect(); - let dp = DynamicProgram::new_native("move_funds".to_string()); + let dp = DynamicProgram::new_native("move_funds".to_string()).unwrap(); dp.call(&mut infos, &data); } assert_eq!(0, accounts[0].tokens);