From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id A89011FF141 for ; Mon, 16 Mar 2026 13:58:17 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3B82419BAA; Mon, 16 Mar 2026 13:58:29 +0100 (CET) Message-ID: <83482468-bd18-4bd3-9e40-9e88b3a9fc0a@proxmox.com> Date: Mon, 16 Mar 2026 13:58:22 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH proxmox-backup] fix #7382: correctly anchor nested paths for include/exclude patterns. To: pbs-devel@lists.proxmox.com References: <20260316120459.35525-1-m.federanko@proxmox.com> Content-Language: en-US From: Nicolas Frey In-Reply-To: <20260316120459.35525-1-m.federanko@proxmox.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1773665862682 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.435 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_1 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_3 0.1 random spam to be learned in bayes RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.408 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.819 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.903 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: UFZQ4Z5VU2XIZ3RZWK7SKIP2A4DAZLAO X-Message-ID-Hash: UFZQ4Z5VU2XIZ3RZWK7SKIP2A4DAZLAO X-MailFrom: n.frey@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Hi, thanks for the patch! nit inline On 3/16/26 1:04 PM, Manuel Federanko wrote: > 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. > nit: consider adding a Fixes trailer to reference the bug report, like so: Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=7382 > Signed-off-by: Manuel Federanko > --- > 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) other than that, LGTM. Consider this: Reviewed-by: Nicolas Frey