mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 22:03:31 +01:00
rust/protover: reject extra commas
The C implementation had gotten this wrong too, in a slightly different way.
Introduced in 5af03c1ef3
.
Fixes #27197; bugfix on 0.3.3.3-alpha.
This commit is contained in:
parent
a546e07600
commit
1ed5e009cb
3
changes/bug27197
Normal file
3
changes/bug27197
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
o Minor bugfixes (protover, rust):
|
||||||
|
- Reject extra commas in version string. Fixes bug 27197; bugfix on
|
||||||
|
0.3.3.3-alpha.
|
@ -329,23 +329,25 @@ impl FromStr for ProtoSet {
|
|||||||
/// assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("3-"));
|
/// assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("3-"));
|
||||||
/// assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1-,4"));
|
/// assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1-,4"));
|
||||||
///
|
///
|
||||||
/// // Things which would get parsed into an _empty_ `ProtoSet` are,
|
/// // An empty string is, however, legal, and results in an
|
||||||
/// // however, legal, and result in an empty `ProtoSet`:
|
/// // empty `ProtoSet`:
|
||||||
/// assert_eq!(Ok(ProtoSet::default()), ProtoSet::from_str(""));
|
/// assert_eq!(Ok(ProtoSet::default()), ProtoSet::from_str(""));
|
||||||
/// assert_eq!(Ok(ProtoSet::default()), ProtoSet::from_str(",,,"));
|
|
||||||
/// #
|
/// #
|
||||||
/// # Ok(protoset)
|
/// # Ok(protoset)
|
||||||
/// # }
|
/// # }
|
||||||
/// # fn main() { do_test(); } // wrap the test so we can use the ? operator
|
/// # fn main() { do_test(); } // wrap the test so we can use the ? operator
|
||||||
/// ```
|
/// ```
|
||||||
fn from_str(version_string: &str) -> Result<Self, Self::Err> {
|
fn from_str(version_string: &str) -> Result<Self, Self::Err> {
|
||||||
|
// If we were passed in an empty string, then return an empty ProtoSet.
|
||||||
|
if version_string.is_empty() {
|
||||||
|
return Ok(Self::default());
|
||||||
|
}
|
||||||
|
|
||||||
let mut pairs: Vec<(Version, Version)> = Vec::new();
|
let mut pairs: Vec<(Version, Version)> = Vec::new();
|
||||||
let pieces: ::std::str::Split<char> = version_string.split(',');
|
let pieces: ::std::str::Split<char> = version_string.split(',');
|
||||||
|
|
||||||
for p in pieces {
|
for p in pieces {
|
||||||
if p.is_empty() {
|
if p.contains('-') {
|
||||||
continue;
|
|
||||||
} else if p.contains('-') {
|
|
||||||
let mut pair = p.splitn(2, '-');
|
let mut pair = p.splitn(2, '-');
|
||||||
|
|
||||||
let low = pair.next().ok_or(ProtoverError::Unparseable)?;
|
let low = pair.next().ok_or(ProtoverError::Unparseable)?;
|
||||||
@ -367,11 +369,7 @@ impl FromStr for ProtoSet {
|
|||||||
pairs.push((v, v));
|
pairs.push((v, v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If we were passed in an empty string, or
|
|
||||||
// simply a comma, or a pile of commas, then return an empty ProtoSet.
|
|
||||||
if pairs.len() == 0 {
|
|
||||||
return Ok(ProtoSet::default());
|
|
||||||
}
|
|
||||||
ProtoSet::from_slice(&pairs[..])
|
ProtoSet::from_slice(&pairs[..])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -535,6 +533,13 @@ mod test {
|
|||||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("-1"));
|
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("-1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_versions_from_str_commas() {
|
||||||
|
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str(","));
|
||||||
|
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1,,2"));
|
||||||
|
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1,2,"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_versions_from_str_hyphens() {
|
fn test_versions_from_str_hyphens() {
|
||||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("--1"));
|
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("--1"));
|
||||||
|
Loading…
Reference in New Issue
Block a user