diff options
author | Isis Lovecruft <isis@torproject.org> | 2018-03-21 03:05:56 +0000 |
---|---|---|
committer | Isis Lovecruft <isis@torproject.org> | 2018-04-02 19:20:34 +0000 |
commit | 6f252e098637bbac87b4ad99ece7fa4a7e404cdb (patch) | |
tree | b0c661fa2b1872783ab2e0fc191cb1d3bba0f7b2 /src/rust | |
parent | 0a5494b81df684109986354a3d31051b6f8d0bec (diff) | |
download | tor-6f252e098637bbac87b4ad99ece7fa4a7e404cdb.tar.gz tor-6f252e098637bbac87b4ad99ece7fa4a7e404cdb.zip |
rust: Refactor Rust impl of protover_compute_vote().
This includes a subtle difference in behaviour to the previous Rust
implementation, where, for each vote that we're computing over, if a single one
fails to parse, we skip it. This now matches the current behaviour in the C
implementation.
* REFACTOR `protover::ffi::protover_compute_vote()` to use
new types and methods.
Diffstat (limited to 'src/rust')
-rw-r--r-- | src/rust/protover/ffi.rs | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/rust/protover/ffi.rs b/src/rust/protover/ffi.rs index 7f8d86d048..780fe6963b 100644 --- a/src/rust/protover/ffi.rs +++ b/src/rust/protover/ffi.rs @@ -161,6 +161,8 @@ pub extern "C" fn protover_get_supported_protocols() -> *const c_char { /// Provide an interface for C to translate arguments and return types for /// protover::compute_vote +// +// Why is the threshold a signed integer? —isis #[no_mangle] pub extern "C" fn protover_compute_vote( list: *const Stringlist, @@ -175,10 +177,19 @@ pub extern "C" fn protover_compute_vote( // Dereference of raw pointer requires an unsafe block. The pointer is // checked above to ensure it is not null. let data: Vec<String> = unsafe { (*list).get_list() }; + let hold: usize = threshold as usize; + let mut proto_entries: Vec<UnvalidatedProtoEntry> = Vec::new(); - let vote = compute_vote(data, threshold); + for datum in data { + let entry: UnvalidatedProtoEntry = match datum.parse() { + Ok(x) => x, + Err(_) => continue, + }; + proto_entries.push(entry); + } + let vote: UnvalidatedProtoEntry = ProtoverVote::compute(&proto_entries, &hold); - allocate_and_copy_string(&vote) + allocate_and_copy_string(&vote.to_string()) } /// Provide an interface for C to translate arguments and return types for |