Skip to content

Commit 4e4af71

Browse files
committed
fix(ffi): Fix additional memory leaks in tests
- address_pool.rs: Add error.free_message() cleanup to tests - wallet_manager_tests.rs: Fix shadowed variable issue where valid wallet/wallet_info were overwritten by later null results, causing the valid ones to leak. Also free wallet in serialization test. - wallet_manager_serialization_tests.rs: Fix test_import_serialized_wallet which created a second manager without freeing the first one
1 parent a26e064 commit 4e4af71

3 files changed

Lines changed: 27 additions & 23 deletions

File tree

key-wallet-ffi/src/address_pool.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,7 @@ mod tests {
11351135
managed_account_free(account);
11361136
wallet_manager_free_wallet_ids(wallet_ids_out, count_out);
11371137
wallet_manager_free(manager);
1138+
error.free_message();
11381139
}
11391140
}
11401141

@@ -1263,6 +1264,7 @@ mod tests {
12631264
managed_account_free(account);
12641265
wallet_manager_free_wallet_ids(wallet_ids_out, count_out);
12651266
wallet_manager_free(manager);
1267+
error.free_message();
12661268
}
12671269
}
12681270
}

key-wallet-ffi/src/wallet_manager_serialization_tests.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ mod tests {
216216
let error = &mut error as *mut FFIError;
217217

218218
// Create a wallet manager
219-
let manager = wallet_manager::wallet_manager_create(FFINetwork::Testnet, error);
220-
assert!(!manager.is_null());
219+
let manager1 = wallet_manager::wallet_manager_create(FFINetwork::Testnet, error);
220+
assert!(!manager1.is_null());
221221

222222
let mnemonic = CString::new(TEST_MNEMONIC).unwrap();
223223
let passphrase = CString::new("").unwrap();
@@ -229,7 +229,7 @@ mod tests {
229229
// First create and serialize a wallet
230230
let success = unsafe {
231231
wallet_manager::wallet_manager_add_wallet_from_mnemonic_return_serialized_bytes(
232-
manager,
232+
manager1,
233233
mnemonic.as_ptr(),
234234
passphrase.as_ptr(),
235235
0,
@@ -247,13 +247,13 @@ mod tests {
247247
assert!(!wallet_bytes_out.is_null());
248248

249249
// Now import the wallet into a new manager
250-
let manager = wallet_manager::wallet_manager_create(FFINetwork::Testnet, error);
251-
assert!(!manager.is_null());
250+
let manager2 = wallet_manager::wallet_manager_create(FFINetwork::Testnet, error);
251+
assert!(!manager2.is_null());
252252

253253
let mut imported_wallet_id = [0u8; 32];
254254
let import_success = unsafe {
255255
wallet_manager::wallet_manager_import_wallet_from_bytes(
256-
manager,
256+
manager2,
257257
wallet_bytes_out,
258258
wallet_bytes_len_out,
259259
imported_wallet_id.as_mut_ptr(),
@@ -273,7 +273,8 @@ mod tests {
273273
wallet_bytes_out,
274274
wallet_bytes_len_out,
275275
);
276-
wallet_manager::wallet_manager_free(manager);
276+
wallet_manager::wallet_manager_free(manager1);
277+
wallet_manager::wallet_manager_free(manager2);
277278
(*error).free_message();
278279
}
279280
}

key-wallet-ffi/src/wallet_manager_tests.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -818,65 +818,65 @@ mod tests {
818818
let wallet_id_slice = unsafe { slice::from_raw_parts(wallet_ids, 32) };
819819

820820
// Test getting the wallet
821-
let wallet = unsafe {
821+
let valid_wallet = unsafe {
822822
wallet_manager::wallet_manager_get_wallet(manager, wallet_id_slice.as_ptr(), error)
823823
};
824-
assert!(!wallet.is_null());
824+
assert!(!valid_wallet.is_null());
825825
assert_eq!(unsafe { (*error).code }, FFIErrorCode::Success);
826826

827827
// Test getting the managed wallet info
828-
let wallet_info = unsafe {
828+
let valid_wallet_info = unsafe {
829829
wallet_manager::wallet_manager_get_managed_wallet_info(
830830
manager,
831831
wallet_id_slice.as_ptr(),
832832
error,
833833
)
834834
};
835-
assert!(!wallet_info.is_null());
835+
assert!(!valid_wallet_info.is_null());
836836
assert_eq!(unsafe { (*error).code }, FFIErrorCode::Success);
837837

838838
// Test with invalid wallet ID (all zeros)
839839
let invalid_wallet_id = [0u8; 32];
840840

841-
let wallet = unsafe {
841+
let invalid_wallet = unsafe {
842842
wallet_manager::wallet_manager_get_wallet(manager, invalid_wallet_id.as_ptr(), error)
843843
};
844-
assert!(wallet.is_null());
844+
assert!(invalid_wallet.is_null());
845845
assert_eq!(unsafe { (*error).code }, FFIErrorCode::NotFound);
846846

847-
let wallet_info = unsafe {
847+
let invalid_wallet_info = unsafe {
848848
wallet_manager::wallet_manager_get_managed_wallet_info(
849849
manager,
850850
invalid_wallet_id.as_ptr(),
851851
error,
852852
)
853853
};
854-
assert!(wallet_info.is_null());
854+
assert!(invalid_wallet_info.is_null());
855855
assert_eq!(unsafe { (*error).code }, FFIErrorCode::NotFound);
856856

857857
// Test with null manager
858-
let wallet = unsafe {
858+
let null_wallet = unsafe {
859859
wallet_manager::wallet_manager_get_wallet(ptr::null(), wallet_id_slice.as_ptr(), error)
860860
};
861-
assert!(wallet.is_null());
861+
assert!(null_wallet.is_null());
862862
assert_eq!(unsafe { (*error).code }, FFIErrorCode::InvalidInput);
863863

864-
let wallet_info = unsafe {
864+
let null_wallet_info = unsafe {
865865
wallet_manager::wallet_manager_get_managed_wallet_info(
866866
ptr::null(),
867867
wallet_id_slice.as_ptr(),
868868
error,
869869
)
870870
};
871-
assert!(wallet_info.is_null());
871+
assert!(null_wallet_info.is_null());
872872
assert_eq!(unsafe { (*error).code }, FFIErrorCode::InvalidInput);
873873

874874
// Clean up
875875
unsafe {
876-
// Free the wallet (cast from const to mut for free)
877-
wallet::wallet_free(wallet as *mut _);
878-
// Free the managed wallet info
879-
crate::managed_wallet::managed_wallet_info_free(wallet_info);
876+
// Free the valid wallet (cast from const to mut for free)
877+
wallet::wallet_free(valid_wallet as *mut _);
878+
// Free the valid managed wallet info
879+
crate::managed_wallet::managed_wallet_info_free(valid_wallet_info);
880880
// Free the wallet IDs
881881
wallet_manager::wallet_manager_free_wallet_ids(wallet_ids, id_count);
882882
// Free the manager
@@ -1174,6 +1174,7 @@ mod tests {
11741174

11751175
// Clean up
11761176
unsafe {
1177+
crate::wallet::wallet_free(wallet as *mut _);
11771178
crate::wallet_manager::wallet_manager_free_wallet_bytes(
11781179
wallet_bytes_out,
11791180
wallet_bytes_len_out,

0 commit comments

Comments
 (0)