all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH proxmox-backup] fix #7382: correctly anchor nested paths for include/exclude patterns.
@ 2026-03-16 12:04 Manuel Federanko
  2026-03-16 12:58 ` Nicolas Frey
  0 siblings, 1 reply; 2+ messages in thread
From: Manuel Federanko @ 2026-03-16 12:04 UTC (permalink / raw)
  To: pbs-devel

A pattern in a subdirectory would be built by just prepending the parent
directory. This could break anchored patterns, which wouldn't match if
the parent directory didn't start with a slash.
Fixed this by explicitly checking if the base path starts with a slash
and prepending it if it does not exist.

It worked for anchored patterns in the root backup directory because
here the pattern is "" + "/exclude".

old:
match_path = /level0/level1/exclude
pattern = level0/level1/exclude

new:
match_path = /level0/level1/exclude
pattern = /level0/level1/exclude

Tested by creating a directory structure as described in the bug ticket
and verifying the behavior.

Signed-off-by: Manuel Federanko <m.federanko@proxmox.com>
---
 pbs-client/src/pxar/create.rs | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/pbs-client/src/pxar/create.rs b/pbs-client/src/pxar/create.rs
index 7f605a61..cec47749 100644
--- a/pbs-client/src/pxar/create.rs
+++ b/pbs-client/src/pxar/create.rs
@@ -537,13 +537,20 @@ impl Archiver {
 
             let mut buf;
             let (line, mode, anchored) = if line[0] == b'/' {
-                buf = Vec::with_capacity(path_bytes.len() + 1 + line.len());
+                buf = Vec::with_capacity(path_bytes.len() + 2 + line.len());
+                // need to anchor the base path if it is not
+                if path_bytes.len() > 0 && path_bytes[0] != b'/' {
+                    buf.push(b'/');
+                }
                 buf.extend(path_bytes);
                 buf.extend(line);
                 (&buf[..], MatchType::Exclude, true)
             } else if line.starts_with(b"!/") {
                 // inverted case with absolute path
-                buf = Vec::with_capacity(path_bytes.len() + line.len());
+                buf = Vec::with_capacity(path_bytes.len() + 1 + line.len());
+                if path_bytes.len() > 0 && path_bytes[0] != b'/' {
+                    buf.push(b'/');
+                }
                 buf.extend(path_bytes);
                 buf.extend(&line[1..]); // without the '!'
                 (&buf[..], MatchType::Include, true)
-- 
2.47.3




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-03-16 12:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-03-16 12:04 [PATCH proxmox-backup] fix #7382: correctly anchor nested paths for include/exclude patterns Manuel Federanko
2026-03-16 12:58 ` Nicolas Frey

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal