Blame SOURCES/0042-Allow-change-of-arch-during-security-updates-with-no.patch

4f31a3
From af5493156ecb1af3aedd5559a9a60b5df54a17ac Mon Sep 17 00:00:00 2001
4f31a3
From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
4f31a3
Date: Wed, 7 Sep 2022 09:07:04 +0200
4f31a3
Subject: [PATCH] Allow change of arch during security updates with noarch
4f31a3
 (RhBug:2124483)
4f31a3
4f31a3
This matches upgrade behaviour where upgrading from/to noarch is a
4f31a3
special case and architecture change of a package is allowed
4f31a3
automatically.
4f31a3
4f31a3
= changelog =
4f31a3
msg: Allow change of architecture for packages during security updates with noarch involved
4f31a3
type: security
4f31a3
resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2124483
4f31a3
---
4f31a3
 libdnf/sack/query.cpp | 34 ++++++++++++++++++++++++----------
4f31a3
 1 file changed, 24 insertions(+), 10 deletions(-)
4f31a3
4f31a3
diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp
4f31a3
index 5355f9f7..b7b1560e 100644
4f31a3
--- a/libdnf/sack/query.cpp
4f31a3
+++ b/libdnf/sack/query.cpp
4f31a3
@@ -189,6 +189,13 @@ NameArchSolvableComparator(const Solvable * first, const Solvable * second)
4f31a3
     return first->arch < second->arch;
4f31a3
 }
4f31a3
 
4f31a3
+static bool
4f31a3
+NameSolvableComparator(const Solvable * first, const Solvable * second)
4f31a3
+{
4f31a3
+    return first->name < second->name;
4f31a3
+}
4f31a3
+
4f31a3
+
4f31a3
 static bool
4f31a3
 NamePrioritySolvableKey(const Solvable * first, const Solvable * second)
4f31a3
 {
4f31a3
@@ -1878,11 +1885,14 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname)
4f31a3
         std::vector<Solvable *> installed_solvables;
4f31a3
 
4f31a3
         if (cmp_type & HY_UPGRADE) {
4f31a3
-            // When doing HY_UPGRADE consider only candidate pkgs that have matching Name and Arch with:
4f31a3
-            // * some already installed pkg (in other words: some other version of the pkg is already installed)
4f31a3
-            // or
4f31a3
-            // * with pkg that obsoletes some already installed (or to be installed in this transaction) pkg
4f31a3
-            // Otherwise a pkg with different Arch than installed can end up in upgrade set which is wrong.
4f31a3
+            // When doing HY_UPGRADE consider only candidate pkgs that:
4f31a3
+            // * have matching Name and Arch with some already installed pkg
4f31a3
+            //   (in other words: some other version of the pkg is already installed)
4f31a3
+            // * have matching Name with some already installed pkg and either the candidate or the installed pkg is noarch.
4f31a3
+            //   This matches upgrade behavior where we allow architecture change only when noarch is involved.
4f31a3
+            //   Details: RhBug:2124483, RhBug:2101398 and RhBug:1171543
4f31a3
+            // * obsoletes some already installed (or to be installed in this transaction) pkg
4f31a3
+            // Otherwise a pkg with different Arch than installed (and than noarch) can end up in upgrade set which is wrong.
4f31a3
             // It can result in dependency issues, reported as: RhBug:2088149.
4f31a3
 
4f31a3
             Query installed(sack, ExcludeFlags::IGNORE_EXCLUDES);
4f31a3
@@ -1893,7 +1903,7 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname)
4f31a3
             while ((installed_id = installed.pImpl->result->next(installed_id)) != -1) {
4f31a3
                 installed_solvables.push_back(pool_id2solvable(pool, installed_id));
4f31a3
             }
4f31a3
-            std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator);
4f31a3
+            std::sort(installed_solvables.begin(), installed_solvables.end(), NameSolvableComparator);
4f31a3
 
4f31a3
             Query obsoletes(sack, ExcludeFlags::IGNORE_EXCLUDES);
4f31a3
             obsoletes.addFilter(HY_PKG, HY_EQ, resultPset);
4f31a3
@@ -1915,12 +1925,16 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname)
4f31a3
             }
4f31a3
 
4f31a3
             Id id = -1;
4f31a3
-            // Add to candidates resultPset pkgs that match name and arch with some already installed pkg
4f31a3
+            // Add to candidates resultPset pkgs that match name and arch with some already installed pkg or match name and either the installed or candidate are NOARCH
4f31a3
             while ((id = resultPset->next(id)) != -1) {
4f31a3
                 Solvable * s = pool_id2solvable(pool, id);
4f31a3
-                auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameArchSolvableComparator);
4f31a3
-                if (low != installed_solvables.end() && s->name == (*low)->name && s->arch == (*low)->arch) {
4f31a3
-                    candidates.push_back(s);
4f31a3
+                auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameSolvableComparator);
4f31a3
+                while (low != installed_solvables.end() && (*low)->name == s->name) {
4f31a3
+                    if (s->arch == (*low)->arch || s->arch == ARCH_NOARCH || (*low)->arch == ARCH_NOARCH) {
4f31a3
+                        candidates.push_back(s);
4f31a3
+                        break;
4f31a3
+                    }
4f31a3
+                    ++low;
4f31a3
                 }
4f31a3
             }
4f31a3
 
4f31a3
-- 
4f31a3
2.37.3
4f31a3