diff --git a/changes/bug27197 b/changes/bug27197 new file mode 100644 index 00000000000..e389f850655 --- /dev/null +++ b/changes/bug27197 @@ -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. diff --git a/src/rust/protover/protoset.rs b/src/rust/protover/protoset.rs index 027dfba2035..309ec7a281d 100644 --- a/src/rust/protover/protoset.rs +++ b/src/rust/protover/protoset.rs @@ -339,13 +339,16 @@ impl FromStr for ProtoSet { /// # fn main() { do_test(); } // wrap the test so we can use the ? operator /// ``` fn from_str(version_string: &str) -> Result { + // If we were passed in an empty string, then return an empty ProtoSet. + if version_string.is_empty() { + return Ok(ProtoSet::default()); + } + let mut pairs: Vec<(Version, Version)> = Vec::new(); let pieces: ::std::str::Split = version_string.split(','); for p in pieces { - if p.is_empty() { - continue; - } else if p.contains('-') { + if p.contains('-') { let mut pair = p.splitn(2, '-'); let low = pair.next().ok_or(ProtoverError::Unparseable)?; @@ -367,11 +370,7 @@ impl FromStr for ProtoSet { 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[..]) } } @@ -536,6 +535,13 @@ mod test { 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] fn test_versions_from_str_hyphens() { assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("--1"));