67 lines
2.5 KiB
Diff
67 lines
2.5 KiB
Diff
From 308ac60677732e9979b9ce11e5a3085906da1901 Mon Sep 17 00:00:00 2001
|
|
From: Michal Domonkos <mdomonko@redhat.com>
|
|
Date: Fri, 26 Jul 2024 10:44:04 +0200
|
|
Subject: [PATCH] Fix root relocation regression
|
|
|
|
Conflict:Do not modify the test code because the current test code is
|
|
different from that of the upstream community. If we directly
|
|
modify the test code, the test wull fail. Guaranteed by local
|
|
use cases.
|
|
Reference:https://github.com/rpm-software-management/rpm/commit/308ac60677732e9979b9ce11e5a3085906da1901
|
|
|
|
When relocating the root directory, make sure we insert the new path's
|
|
dirname to dirNames[] even if the root itself is owned by the package.
|
|
|
|
This appears to have been the intention from the first version (largely
|
|
untouched since) of this code as we allow the root to pass through the
|
|
first checks (by setting len to 0 in that case) as well as the second
|
|
for loop where we do the relocations.
|
|
|
|
This allows fsm to properly create and remove the relocated directory
|
|
since we're now using fd-based calls (#1919) and the parent directory
|
|
needs to be opened first.
|
|
|
|
No need to do string comparison here, the empty basename signals that
|
|
we're processing the root directory, so just use that.
|
|
|
|
Building a relocatable package that owns the root directory seems to be
|
|
a handy way to create user-installable packages (see RHEL-28967) and it
|
|
happened to work before with the path-based calls so this technically
|
|
was a regression. Add a test that emulates this use case.
|
|
|
|
Fixes: #3173
|
|
---
|
|
lib/relocation.c | 8 +++++---
|
|
1 files changed, 5 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/lib/relocation.c b/lib/relocation.c
|
|
index d31cf4779..0202b5c46 100644
|
|
--- a/lib/relocation.c
|
|
+++ b/lib/relocation.c
|
|
@@ -181,8 +181,9 @@ void rpmRelocateFileList(rpmRelocation *relocations, int numRelocations,
|
|
rpmFileTypes ft;
|
|
int fnlen;
|
|
|
|
+ size_t baselen = strlen(baseNames[i]);
|
|
size_t len = maxlen +
|
|
- strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1;
|
|
+ strlen(dirNames[dirIndexes[i]]) + baselen + 1;
|
|
if (len >= fileAlloced) {
|
|
fileAlloced = len * 2;
|
|
fn = xrealloc(fn, fileAlloced);
|
|
@@ -244,8 +245,9 @@ assert(fn != NULL); /* XXX can't happen */
|
|
continue;
|
|
}
|
|
|
|
- /* Relocation on full paths only, please. */
|
|
- if (fnlen != len) continue;
|
|
+ /* Relocation on '/' and full paths only, please. */
|
|
+ if (baselen && fnlen != len)
|
|
+ continue;
|
|
|
|
rpmlog(RPMLOG_DEBUG, "relocating %s to %s\n",
|
|
fn, relocations[j].newPath);
|
|
--
|
|
2.33.0
|
|
|