Pattern: strip triling slashes, forbid empty patterns

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2020-04-28 12:05:53 +02:00
parent 96d7b7c74d
commit b1a5365911

View File

@ -90,6 +90,7 @@ bitflags! {
/// Error cases which may happen while parsing a pattern. /// Error cases which may happen while parsing a pattern.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub enum ParseError { pub enum ParseError {
EmptyPattern,
NulByteError, NulByteError,
TrailingBackslash, TrailingBackslash,
UnclosedCharacterClass(usize), UnclosedCharacterClass(usize),
@ -101,6 +102,7 @@ impl std::error::Error for ParseError {}
impl fmt::Display for ParseError { impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self { match self {
ParseError::EmptyPattern => write!(f, "empty pattern"),
ParseError::NulByteError => write!(f, "null-byte in pattern"), ParseError::NulByteError => write!(f, "null-byte in pattern"),
ParseError::TrailingBackslash => write!(f, "trailing backslash in pattern"), ParseError::TrailingBackslash => write!(f, "trailing backslash in pattern"),
ParseError::UnclosedCharacterClass(begin) => write!( ParseError::UnclosedCharacterClass(begin) => write!(
@ -163,6 +165,16 @@ impl Pattern {
} }
fn new_do(pattern: &[u8], flags: PatternFlag) -> Result<Self, ParseError> { fn new_do(pattern: &[u8], flags: PatternFlag) -> Result<Self, ParseError> {
if pattern.is_empty() {
return Err(ParseError::EmptyPattern);
}
// strip trailing slashes:
let pattern = match pattern.iter().rposition(|&b| b != b'/') {
Some(pos) => &pattern[..=pos],
None => b"/",
};
let c_pattern = std::ffi::CString::new(pattern).map_err(|_| ParseError::NulByteError)?; let c_pattern = std::ffi::CString::new(pattern).map_err(|_| ParseError::NulByteError)?;
let mut components = Vec::<Component>::new(); let mut components = Vec::<Component>::new();