Skip to content

Commit 6dedd3f

Browse files
committed
Avoid string copy for plugged SP parsing.
Signed-off-by: Sergey Minaev <[email protected]>
1 parent e392d77 commit 6dedd3f

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

libindy/src/services/pool/transaction_handler.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use serde_json;
1717
use serde_json::Value as SJsonValue;
1818
use std::collections::HashMap;
1919
use std::error::Error;
20-
use std::ffi::CString;
20+
use std::ffi::{CStr, CString};
2121
use std::ops::Add;
2222

2323
use super::state_proof;
@@ -31,7 +31,6 @@ use domain::ledger::constants;
3131
use services::ledger::merkletree::merkletree::MerkleTree;
3232
use services::pool::PoolService;
3333
use self::indy_crypto::bls::Generator;
34-
use utils::cstring::CStringUtils;
3534

3635
const REQUESTS_FOR_STATE_PROOFS: [&'static str; 7] = [
3736
constants::GET_NYM,
@@ -294,20 +293,19 @@ impl TransactionHandler {
294293
debug!("TransactionHandler::parse_generic_reply_for_proof_checking: <<< plugin return err {:?}", err);
295294
return None;
296295
}
297-
let parsed_str = CStringUtils::c_str_to_string(parsed_c_str).ok()??;
296+
let c_str = if parsed_c_str.is_null() { None } else { Some(unsafe { CStr::from_ptr(parsed_c_str) }) };
297+
let parsed_sps = c_str
298+
.and_then(|c_str| c_str.to_str().map_err(map_err_trace!()).ok())
299+
.and_then(|c_str|
300+
serde_json::from_str::<Vec<ParsedSP>>(c_str)
301+
.map_err(|err|
302+
debug!("TransactionHandler::parse_generic_reply_for_proof_checking: <<< can't parse plugin response {}", err))
303+
.ok());
298304

299305
let err = free(parsed_c_str);
300306
trace!("TransactionHandler::parse_generic_reply_for_proof_checking: plugin free res {:?}", err);
301307

302-
let parsed_sp = match serde_json::from_str::<Vec<ParsedSP>>(&parsed_str) {
303-
Ok(ps) => ps,
304-
Err(err) => {
305-
debug!("TransactionHandler::parse_generic_reply_for_proof_checking: <<< can't parse plugin response {}", err);
306-
return None;
307-
},
308-
};
309-
310-
Some(parsed_sp)
308+
parsed_sps
311309
} else {
312310
trace!("TransactionHandler::parse_generic_reply_for_proof_checking: <<< type not supported");
313311
None

0 commit comments

Comments
 (0)