]> git.proxmox.com Git - proxmox-backup.git/commitdiff
pxar: add error handling for MatchPattern::matches_filename()
authorChristian Ebner <c.ebner@proxmox.com>
Mon, 5 Aug 2019 12:28:03 +0000 (14:28 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 6 Aug 2019 07:02:44 +0000 (09:02 +0200)
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
src/pxar/encoder.rs
src/pxar/match_pattern.rs
src/pxar/sequential_decoder.rs

index 1a499bd25c69f7241bbfa82338f0b19c97c36521..5e4db40a01b7947a07088dd54de02aeef8b1623f 100644 (file)
@@ -687,7 +687,7 @@ impl <'a, W: Write> Encoder<'a, W> {
                     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, _) => {
                         let filename_osstr = std::ffi::OsStr::from_bytes(filename.to_bytes());
                         eprintln!("matched by .pxarexclude entry - skipping: {:?}", self.full_path().join(filename_osstr));
@@ -1076,12 +1076,12 @@ fn match_filename(
     filename: &CStr,
     stat: &FileStat,
     match_pattern: &Vec<MatchPattern>
-) ->  (MatchType, Vec<MatchPattern>) {
+) -> Result<(MatchType, Vec<MatchPattern>), Error> {
     let mut child_pattern = Vec::new();
     let mut match_state = MatchType::None;
 
     for pattern in match_pattern {
-        match pattern.matches_filename(filename, is_directory(&stat)) {
+        match pattern.matches_filename(filename, is_directory(&stat))? {
             MatchType::None =>  {},
             MatchType::Positive =>  match_state = MatchType::Positive,
             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 {
index 6da90261f0fbe75da56a0076e0f0bde5aa854b1e..30cf7103bc075d003c6b61ca379476edf00550d0 100644 (file)
@@ -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 (front, _) = &self.split_pattern;
 
@@ -152,7 +152,9 @@ impl MatchPattern {
             let filename_ptr = filename.as_ptr() as *const libc::c_char;
             fnmatch(front_ptr, filename_ptr , 0)
         };
-        // TODO error cases
+        if fnmatch_res < 0 {
+            bail!("error in fnmatch inside of MatchPattern");
+        }
         if fnmatch_res == 0 {
             res = if self.match_positive {
                 MatchType::PartialPositive
@@ -171,7 +173,9 @@ impl MatchPattern {
             let filename_ptr = filename.as_ptr() as *const libc::c_char;
             fnmatch(full_ptr, filename_ptr, 0)
         };
-        // TODO error cases
+        if fnmatch_res < 0 {
+            bail!("error in fnmatch inside of MatchPattern");
+        }
         if fnmatch_res == 0 {
             res = if self.match_positive {
                 MatchType::Positive
@@ -188,7 +192,7 @@ impl MatchPattern {
             res = MatchType::None;
         }
 
-        res
+        Ok(res)
     }
 }
 
index aff52680df5e14fd26b3c5d7775b4da11c850649..e2aba0ef7ab98e3dcc519e56a6a7609466143e16 100644 (file)
@@ -750,7 +750,7 @@ impl <'a, R: Read, F: Fn(&Path) -> Result<(), Error>> SequentialDecoder<'a, R, F
         // there are no match pattern.
         let mut matched = parent_matched;
         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::Negative, _) => matched = MatchType::Negative,
                 (match_type, pattern) => {
@@ -1030,14 +1030,14 @@ fn match_filename(
     filename: &OsStr,
     is_dir: bool,
     match_pattern: &Vec<MatchPattern>
-) ->  (MatchType, Vec<MatchPattern>) {
+) -> Result<(MatchType, Vec<MatchPattern>), Error> {
     let mut child_pattern = Vec::new();
     let mut match_state = MatchType::None;
     // read_filename() checks for nul bytes, so it is save to unwrap here
     let name = CString::new(filename.as_bytes()).unwrap();
 
     for pattern in match_pattern {
-        match pattern.matches_filename(&name, is_dir) {
+        match pattern.matches_filename(&name, is_dir)? {
             MatchType::None =>  {},
             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> {