pxar: add error handling for MatchPattern::matches_filename()
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
parent
8c70e3eb18
commit
43e892d293
@ -687,7 +687,7 @@ impl <'a, W: Write> Encoder<'a, W> {
|
|||||||
Err(err) => bail!("fstat {:?} failed - {}", self.full_path(), err),
|
Err(err) => bail!("fstat {:?} failed - {}", self.full_path(), err),
|
||||||
};
|
};
|
||||||
|
|
||||||
match match_filename(&filename, &stat, &local_match_pattern) {
|
match match_filename(&filename, &stat, &local_match_pattern)? {
|
||||||
(MatchType::Positive, _) => {
|
(MatchType::Positive, _) => {
|
||||||
let filename_osstr = std::ffi::OsStr::from_bytes(filename.to_bytes());
|
let filename_osstr = std::ffi::OsStr::from_bytes(filename.to_bytes());
|
||||||
eprintln!("matched by .pxarexclude entry - skipping: {:?}", self.full_path().join(filename_osstr));
|
eprintln!("matched by .pxarexclude entry - skipping: {:?}", self.full_path().join(filename_osstr));
|
||||||
@ -1076,12 +1076,12 @@ fn match_filename(
|
|||||||
filename: &CStr,
|
filename: &CStr,
|
||||||
stat: &FileStat,
|
stat: &FileStat,
|
||||||
match_pattern: &Vec<MatchPattern>
|
match_pattern: &Vec<MatchPattern>
|
||||||
) -> (MatchType, Vec<MatchPattern>) {
|
) -> Result<(MatchType, Vec<MatchPattern>), Error> {
|
||||||
let mut child_pattern = Vec::new();
|
let mut child_pattern = Vec::new();
|
||||||
let mut match_state = MatchType::None;
|
let mut match_state = MatchType::None;
|
||||||
|
|
||||||
for pattern in match_pattern {
|
for pattern in match_pattern {
|
||||||
match pattern.matches_filename(filename, is_directory(&stat)) {
|
match pattern.matches_filename(filename, is_directory(&stat))? {
|
||||||
MatchType::None => {},
|
MatchType::None => {},
|
||||||
MatchType::Positive => match_state = MatchType::Positive,
|
MatchType::Positive => match_state = MatchType::Positive,
|
||||||
MatchType::Negative => match_state = MatchType::Negative,
|
MatchType::Negative => match_state = MatchType::Negative,
|
||||||
@ -1094,7 +1094,7 @@ fn match_filename(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(match_state, child_pattern)
|
Ok((match_state, child_pattern))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn errno_is_unsupported(errno: Errno) -> bool {
|
fn errno_is_unsupported(errno: Errno) -> bool {
|
||||||
|
@ -143,7 +143,7 @@ impl MatchPattern {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn matches_filename(&self, filename: &CStr, is_dir: bool) -> MatchType {
|
pub fn matches_filename(&self, filename: &CStr, is_dir: bool) -> Result<MatchType, Error> {
|
||||||
let mut res = MatchType::None;
|
let mut res = MatchType::None;
|
||||||
let (front, _) = &self.split_pattern;
|
let (front, _) = &self.split_pattern;
|
||||||
|
|
||||||
@ -152,7 +152,9 @@ impl MatchPattern {
|
|||||||
let filename_ptr = filename.as_ptr() as *const libc::c_char;
|
let filename_ptr = filename.as_ptr() as *const libc::c_char;
|
||||||
fnmatch(front_ptr, filename_ptr , 0)
|
fnmatch(front_ptr, filename_ptr , 0)
|
||||||
};
|
};
|
||||||
// TODO error cases
|
if fnmatch_res < 0 {
|
||||||
|
bail!("error in fnmatch inside of MatchPattern");
|
||||||
|
}
|
||||||
if fnmatch_res == 0 {
|
if fnmatch_res == 0 {
|
||||||
res = if self.match_positive {
|
res = if self.match_positive {
|
||||||
MatchType::PartialPositive
|
MatchType::PartialPositive
|
||||||
@ -171,7 +173,9 @@ impl MatchPattern {
|
|||||||
let filename_ptr = filename.as_ptr() as *const libc::c_char;
|
let filename_ptr = filename.as_ptr() as *const libc::c_char;
|
||||||
fnmatch(full_ptr, filename_ptr, 0)
|
fnmatch(full_ptr, filename_ptr, 0)
|
||||||
};
|
};
|
||||||
// TODO error cases
|
if fnmatch_res < 0 {
|
||||||
|
bail!("error in fnmatch inside of MatchPattern");
|
||||||
|
}
|
||||||
if fnmatch_res == 0 {
|
if fnmatch_res == 0 {
|
||||||
res = if self.match_positive {
|
res = if self.match_positive {
|
||||||
MatchType::Positive
|
MatchType::Positive
|
||||||
@ -188,7 +192,7 @@ impl MatchPattern {
|
|||||||
res = MatchType::None;
|
res = MatchType::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
res
|
Ok(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,7 +750,7 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
|
|||||||
// there are no match pattern.
|
// there are no match pattern.
|
||||||
let mut matched = parent_matched;
|
let mut matched = parent_matched;
|
||||||
if match_pattern.len() > 0 {
|
if match_pattern.len() > 0 {
|
||||||
match match_filename(filename, entry.mode as u32 & libc::S_IFMT == libc::S_IFDIR, match_pattern) {
|
match match_filename(filename, entry.mode as u32 & libc::S_IFMT == libc::S_IFDIR, match_pattern)? {
|
||||||
(MatchType::None, _) => matched = MatchType::None,
|
(MatchType::None, _) => matched = MatchType::None,
|
||||||
(MatchType::Negative, _) => matched = MatchType::Negative,
|
(MatchType::Negative, _) => matched = MatchType::Negative,
|
||||||
(match_type, pattern) => {
|
(match_type, pattern) => {
|
||||||
@ -1030,14 +1030,14 @@ fn match_filename(
|
|||||||
filename: &OsStr,
|
filename: &OsStr,
|
||||||
is_dir: bool,
|
is_dir: bool,
|
||||||
match_pattern: &Vec<MatchPattern>
|
match_pattern: &Vec<MatchPattern>
|
||||||
) -> (MatchType, Vec<MatchPattern>) {
|
) -> Result<(MatchType, Vec<MatchPattern>), Error> {
|
||||||
let mut child_pattern = Vec::new();
|
let mut child_pattern = Vec::new();
|
||||||
let mut match_state = MatchType::None;
|
let mut match_state = MatchType::None;
|
||||||
// read_filename() checks for nul bytes, so it is save to unwrap here
|
// read_filename() checks for nul bytes, so it is save to unwrap here
|
||||||
let name = CString::new(filename.as_bytes()).unwrap();
|
let name = CString::new(filename.as_bytes()).unwrap();
|
||||||
|
|
||||||
for pattern in match_pattern {
|
for pattern in match_pattern {
|
||||||
match pattern.matches_filename(&name, is_dir) {
|
match pattern.matches_filename(&name, is_dir)? {
|
||||||
MatchType::None => {},
|
MatchType::None => {},
|
||||||
MatchType::Positive => {
|
MatchType::Positive => {
|
||||||
match_state = MatchType::Positive;
|
match_state = MatchType::Positive;
|
||||||
@ -1060,7 +1060,7 @@ fn match_filename(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(match_state, child_pattern)
|
Ok((match_state, child_pattern))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn file_openat(parent: RawFd, filename: &OsStr, flags: OFlag, mode: Mode) -> Result<std::fs::File, Error> {
|
fn file_openat(parent: RawFd, filename: &OsStr, flags: OFlag, mode: Mode) -> Result<std::fs::File, Error> {
|
||||||
|
Loading…
Reference in New Issue
Block a user