summaryrefslogtreecommitdiff
path: root/backport-Fix-root-relocation-regression.patch
diff options
context:
space:
mode:
Diffstat (limited to 'backport-Fix-root-relocation-regression.patch')
-rw-r--r--backport-Fix-root-relocation-regression.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/backport-Fix-root-relocation-regression.patch b/backport-Fix-root-relocation-regression.patch
new file mode 100644
index 0000000..bfe792b
--- /dev/null
+++ b/backport-Fix-root-relocation-regression.patch
@@ -0,0 +1,66 @@
+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
+