summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanu Matilainen <pmatilai@redhat.com>2022-03-23 13:05:57 +0200
committerPanu Matilainen <pmatilai@redhat.com>2022-03-28 10:43:36 +0300
commitcf2752b05c47a9461ffcaea04bdb774905286ba6 (patch)
treee6335fddc6838fad8770356ee93074c83bf41886
parenta7ceb572cfe1066a6dc425a272ed6b99747eaccc (diff)
downloadrpm-cf2752b05c47a9461ffcaea04bdb774905286ba6.tar.gz
Fix non-installed files taking part in file disposition calculations
Files that are not installed cannot conflict with anything, any more than skipped files can. The latter we handled, the former not. Strange what "obvious" cases can go on unnoticed forever, when lacking systematic tests.
-rw-r--r--lib/transaction.c3
-rw-r--r--tests/rpme.at17
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/transaction.c b/lib/transaction.c
index 6c20c0094..456c0c6de 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -434,6 +434,9 @@ static void handleInstInstalledFile(const rpmts ts, rpmte p, rpmfiles fi, int fx
if (XFA_SKIPPING(rpmfsGetAction(fs, fx)))
return;
+ if (rpmfilesFState(otherFi, ofx) == RPMFILE_STATE_NOTINSTALLED)
+ return;
+
if (rpmfilesCompare(otherFi, ofx, fi, fx)) {
int rConflicts = 1;
char rState = RPMFILE_STATE_REPLACED;
diff --git a/tests/rpme.at b/tests/rpme.at
index c41348f2f..2d395e27c 100644
--- a/tests/rpme.at
+++ b/tests/rpme.at
@@ -226,6 +226,23 @@ for p in a b; do
done
AT_CHECK([
+runroot rpm -U --ignoreos --excludepath=/usr/share /build/RPMS/noarch/conflicta-1.0-1.noarch.rpm
+runroot rpm -U --ignoreos /build/RPMS/noarch/conflictb-1.0-1.noarch.rpm
+runroot rpm -Vav --nogroup --nouser conflicta conflictb
+runroot rpm -e conflicta
+runroot rpm -Vav --nogroup --nouser conflictb
+runroot rpm -e conflictb
+runroot rpm -Vp --nogroup --nouser /build/RPMS/noarch/conflictb-1.0-1.noarch.rpm
+],
+[1],
+[......... /usr/share/my.version (not installed)
+......... /usr/share/my.version
+......... /usr/share/my.version
+missing /usr/share/my.version
+],
+[])
+
+AT_CHECK([
runroot rpm -U --ignoreos /build/RPMS/noarch/conflicta-1.0-1.noarch.rpm
runroot rpm -U --ignoreos --force /build/RPMS/noarch/conflictb-1.0-1.noarch.rpm
runroot rpm -Vav --nogroup --nouser conflicta conflictb