92d408
From 2e61e5846f8301f85da9d30281538ea736d96fd0 Mon Sep 17 00:00:00 2001
92d408
From: Michal Domonkos <mdomonko@redhat.com>
92d408
Date: Tue, 7 Dec 2021 08:08:37 +0100
92d408
Subject: [PATCH] Skip recorded symlinks in --setperms (RhBug:1900662)
92d408
92d408
If a package contains a symlink in the buildroot which is declared as a
92d408
ghost or config file but is a regular file or directory on the system
92d408
where it's installed, a --setperms call will reset its permissions to
92d408
those of a symlink (777 on Linux), which almost certainly is not the
92d408
correct thing to do.
92d408
92d408
To fix that, just skip files that were recorded as symlinks.
92d408
92d408
This is a special case of a general issue in --setperms; since file
92d408
permission semantics may change depending on the file type, to stay on
92d408
the safe side, any (ghost or config) file whose type changes after
92d408
installation should probably be skipped.  However, symlinks are the most
92d408
prominent case here, so let's just focus on that now and avoid adding
92d408
too much cleverness to a popt alias (this got us into trouble not too
92d408
long ago, see commits 38c2f6e and 0d83637).  We may revisit this in the
92d408
eventual C implementation.
92d408
---
92d408
 rpmpopt.in | 1 +
92d408
 1 file changed, 1 insertion(+)
92d408
92d408
diff --git a/rpmpopt.in b/rpmpopt.in
92d408
index 67fcabfb1..e130a5d05 100644
92d408
--- a/rpmpopt.in
92d408
+++ b/rpmpopt.in
92d408
@@ -44,6 +44,7 @@ rpm	alias --scripts --qf '\
92d408
 	--POPTdesc=$"list install/erase scriptlets from package(s)"
92d408
 
92d408
 rpm	alias --setperms -q --qf '[\[ -L %{FILENAMES:shescape} \] || \
92d408
+        \[ -n %{FILELINKTOS:shescape} \] || \
92d408
         ( \[ $((%{FILEFLAGS} & 2#1001000)) != 0 \] && \[ ! -e %{FILENAMES:shescape} \] ) || \
92d408
         chmod %7{FILEMODES:octal} %{FILENAMES:shescape}\n]' \
92d408
 		   --pipe "grep -v \(none\) | grep '^. -L ' | sed 's/chmod .../chmod /' | sh" \
92d408
-- 
92d408
2.35.1
92d408