Skip to content

Commit ca1ba9f

Browse files
committed
fix: prevent FFIError message leaks in tests
This fixes a bunch of memory leaks in tests detected by sanitizer in CI overhaul PR dashpay#253. - Modified `set_error`, `set_success`, and `ffi_error_set` macro to free previous error messages before setting new ones - Added `FFIError::free_message` helper for test cleanup - Added cleanup in all relevalt tests
1 parent d6dd433 commit ca1ba9f

15 files changed

+275
-48
lines changed

key-wallet-ffi/src/account_derivation_tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ mod tests {
5959
extended_private_key_free(master_xpriv);
6060
account_free(account);
6161
wallet::wallet_free(wallet);
62+
error.free_message();
6263
}
6364
}
6465

@@ -97,6 +98,8 @@ mod tests {
9798
);
9899
assert_eq!(error.code, FFIErrorCode::InvalidInput);
99100
}
101+
102+
unsafe { error.free_message() };
100103
}
101104

102105
#[test]
@@ -134,6 +137,7 @@ mod tests {
134137
extended_private_key_free(master_xpriv);
135138
account_free(account);
136139
wallet::wallet_free(wallet);
140+
error.free_message();
137141
}
138142
}
139143

@@ -213,6 +217,7 @@ mod tests {
213217
unsafe {
214218
account_free(account);
215219
wallet::wallet_free(wallet);
220+
error.free_message();
216221
}
217222
}
218223

key-wallet-ffi/src/account_tests.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ mod tests {
7777

7878
assert_eq!(count, 0);
7979
assert_eq!(error.code, FFIErrorCode::InvalidInput);
80+
81+
unsafe { error.free_message() };
8082
}
8183

8284
#[test]
@@ -105,6 +107,7 @@ mod tests {
105107
// Clean up
106108
unsafe {
107109
wallet::wallet_free(wallet);
110+
error.free_message();
108111
}
109112
}
110113

@@ -190,6 +193,7 @@ mod tests {
190193
// Clean up
191194
unsafe {
192195
wallet::wallet_free(wallet);
196+
error.free_message();
193197
}
194198
}
195199

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/address_tests.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ mod address_tests {
2929
let is_valid = unsafe { address_validate(ptr::null(), FFINetwork::Testnet, error) };
3030
assert!(!is_valid);
3131
assert_eq!(unsafe { (*error).code }, FFIErrorCode::InvalidInput);
32+
33+
unsafe { (*error).free_message() };
3234
}
3335

3436
#[test]
@@ -43,6 +45,8 @@ mod address_tests {
4345
assert_eq!(unsafe { (*error).code }, FFIErrorCode::Success);
4446
// Returns 0 for P2PKH
4547
assert_eq!(addr_type, 0);
48+
49+
unsafe { (*error).free_message() };
4650
}
4751

4852
#[test]
@@ -55,6 +59,8 @@ mod address_tests {
5559
unsafe { address_validate(addr_str.as_ptr(), FFINetwork::Testnet, &mut error) };
5660

5761
assert!(is_valid);
62+
63+
unsafe { error.free_message() };
5864
}
5965

6066
#[test]
@@ -68,6 +74,8 @@ mod address_tests {
6874

6975
assert!(!is_valid);
7076
assert_eq!(error.code, FFIErrorCode::InvalidAddress);
77+
78+
unsafe { error.free_message() };
7179
}
7280

7381
#[test]
@@ -78,6 +86,8 @@ mod address_tests {
7886

7987
assert!(!is_valid);
8088
assert_eq!(error.code, FFIErrorCode::InvalidInput);
89+
90+
unsafe { error.free_message() };
8191
}
8292

8393
#[test]
@@ -97,6 +107,8 @@ mod address_tests {
97107
assert!(addr_type <= 2);
98108
assert_eq!(error.code, FFIErrorCode::Success);
99109
}
110+
111+
unsafe { error.free_message() };
100112
}
101113

102114
#[test]
@@ -110,6 +122,8 @@ mod address_tests {
110122
// Should return 255 (u8::MAX) for invalid
111123
assert_eq!(addr_type, 255);
112124
assert_eq!(error.code, FFIErrorCode::InvalidAddress);
125+
126+
unsafe { error.free_message() };
113127
}
114128

115129
#[test]
@@ -121,6 +135,8 @@ mod address_tests {
121135
// Should return 255 (u8::MAX) for null input
122136
assert_eq!(addr_type, 255);
123137
assert_eq!(error.code, FFIErrorCode::InvalidInput);
138+
139+
unsafe { error.free_message() };
124140
}
125141

126142
#[test]
@@ -177,6 +193,8 @@ mod address_tests {
177193
let is_valid = address_validate(addr_str.as_ptr(), FFINetwork::Testnet, &mut error);
178194
assert!(!is_valid);
179195
}
196+
197+
error.free_message();
180198
}
181199
}
182200

@@ -200,6 +218,8 @@ mod address_tests {
200218
// Should return a valid type (0, 1, 2) or 255 for error
201219
assert!(addr_type <= 2 || addr_type == 255);
202220
}
221+
222+
error.free_message();
203223
}
204224
}
205225
}

0 commit comments

Comments
 (0)