aboutsummaryrefslogtreecommitdiff
path: root/src/rust
diff options
context:
space:
mode:
authorIsis Lovecruft <isis@torproject.org>2018-03-21 03:05:56 +0000
committerIsis Lovecruft <isis@torproject.org>2018-04-02 19:20:34 +0000
commit6f252e098637bbac87b4ad99ece7fa4a7e404cdb (patch)
treeb0c661fa2b1872783ab2e0fc191cb1d3bba0f7b2 /src/rust
parent0a5494b81df684109986354a3d31051b6f8d0bec (diff)
downloadtor-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.rs15
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