tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 44facb83d5b8801ec53135fab8a1f610d468fcd1
parent 419ea2f813c83a2065396ac085c9525dd2e1f137
Author: cypherpunks <cypherpunks@torproject.org>
Date:   Sun,  9 Feb 2020 01:15:18 +0000

rust/protover: parse empty string into empty *ProtoEntry

Contrary to what 15e59a1fedf47e7e689e06e5649849552d8b8c0d
said, the C implementation has always accepted an empty string
without complaint. Meanwhile the rust implementation has always
given an error. Make the rust implementation match C.

Also eliminate some more redundant tests.

Fix on 0.3.3.1-alpha.

Diffstat:
Msrc/rust/protover/protover.rs | 12+++++++++++-
Msrc/rust/protover/tests/protover.rs | 13-------------
2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/src/rust/protover/protover.rs b/src/rust/protover/protover.rs @@ -245,6 +245,11 @@ impl FromStr for ProtoEntry { /// Otherwise, the `Err` value of this `Result` is a `ProtoverError`. fn from_str(protocol_entry: &str) -> Result<ProtoEntry, ProtoverError> { let mut proto_entry: ProtoEntry = ProtoEntry::default(); + + if protocol_entry.is_empty() { + return Ok(proto_entry); + } + let entries = protocol_entry.split(' '); for entry in entries { @@ -493,6 +498,10 @@ impl UnvalidatedProtoEntry { ) -> Result<Vec<(&'a str, &'a str)>, ProtoverError> { let mut protovers: Vec<(&str, &str)> = Vec::new(); + if protocol_string.is_empty() { + return Ok(protovers); + } + for subproto in protocol_string.split(' ') { let mut parts = subproto.splitn(2, '='); @@ -851,7 +860,8 @@ mod test { #[test] fn test_protoentry_from_str_empty() { - assert_protoentry_is_unparseable!(""); + assert_protoentry_is_parseable!(""); + assert!(UnvalidatedProtoEntry::from_str("").is_ok()); } #[test] diff --git a/src/rust/protover/tests/protover.rs b/src/rust/protover/tests/protover.rs @@ -70,18 +70,6 @@ fn protocol_all_supported_with_one_value() { } #[test] -#[should_panic] -fn parse_protocol_unvalidated_with_empty() { - let _: UnvalidatedProtoEntry = "".parse().unwrap(); -} - -#[test] -#[should_panic] -fn parse_protocol_validated_with_empty() { - let _: ProtoEntry = "".parse().unwrap(); -} - -#[test] fn protocol_all_supported_with_three_values() { let protocols: UnvalidatedProtoEntry = "LinkAuth=1 Microdesc=1-2 Relay=2".parse().unwrap(); let unsupported: Option<UnvalidatedProtoEntry> = protocols.all_supported(); @@ -156,7 +144,6 @@ fn parse_protocol_with_unexpected_characters() { } #[test] -#[should_panic] fn protover_compute_vote_returns_empty_for_empty_string() { let protocols: &[UnvalidatedProtoEntry] = &["".parse().unwrap()]; let listed = ProtoverVote::compute(protocols, &1);