all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Manuel Federanko <m.federanko@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [PATCH proxmox-backup] fix #7382: correctly anchor nested paths for include/exclude patterns.
Date: Mon, 16 Mar 2026 13:04:59 +0100	[thread overview]
Message-ID: <20260316120459.35525-1-m.federanko@proxmox.com> (raw)

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




             reply	other threads:[~2026-03-16 12:05 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-16 12:04 Manuel Federanko [this message]
2026-03-16 12:58 ` Nicolas Frey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260316120459.35525-1-m.federanko@proxmox.com \
    --to=m.federanko@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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