Compare commits

...

11 Commits

Author SHA1 Message Date
openeuler-ci-bot
17561b3618
!63 libsolv: Handle installed packages in three passes
From: @Lu__Wu 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-07-23 09:19:09 +00:00
LuWu
9386dfaa06 libsolv:Handle installed packages in three passes
Reference:553c69b514
bbd1801748
bbd1801748
Conflict:no
2024-07-23 14:26:20 +08:00
openeuler-ci-bot
ffe8629a7e
!54 [sync] PR-51: Fix a couple small static analysis findings for uninitialized structs
From: @openeuler-sync-bot 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-07-05 08:33:42 +00:00
guojunding
6569b0341e Fix a couple small static analysis findings for uninitialized structs
(cherry picked from commit 38158584568db4d66091146652887c178185c0df)
2024-07-04 20:43:32 +08:00
openeuler-ci-bot
5332e19c34
!49 update libsolv to 0.7.24-1
From: @han_hui_hui 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2024-02-08 01:13:47 +00:00
han_hui_hui
ba4bea499c update libsolv to 0.7.24-1 2024-02-04 07:09:46 +00:00
openeuler-ci-bot
69ddf5f279
!44 fix requirement error
From: @han_hui_hui 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2023-08-21 01:15:04 +00:00
hanhuihui
571f9443ba fix requirement error 2023-08-19 21:17:35 +08:00
openeuler-ci-bot
1f43668bc4
!42 update libsolv to 0.7.22
From: @han_hui_hui 
Reviewed-by: @anonymous_z 
Signed-off-by: @anonymous_z
2022-11-09 09:44:50 +00:00
han_hui_hui
84c51b04bd update libsolv to 0.7.22 2022-11-09 09:33:44 +00:00
openeuler-ci-bot
4274baa686
!35 ensure duplinvolvedmap_all is reset
From: @han_hui_hui 
Reviewed-by: @t_feng 
Signed-off-by: @t_feng
2022-10-24 02:52:48 +00:00
13 changed files with 498 additions and 94 deletions

Binary file not shown.

BIN
0.7.24.tar.gz Normal file

Binary file not shown.

View File

@ -1,29 +0,0 @@
From 9a361f5248557e032f15890aac54c0db53c52098 Mon Sep 17 00:00:00 2001
From: banjiuqingshan <63209634+banjiuqingshan@users.noreply.github.com>
Date: Sun, 19 Jun 2022 01:43:51 +0800
Subject: [PATCH] Fix memory leak when using testsolv to execute cases
*resultp will only keep the pointer of the last cycle, which will lead to memory leakage.
This solves the first memory leak problem in issue #496 "==255147==error..."
---
ext/testcase.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/ext/testcase.c b/ext/testcase.c
index 035cfdbd..c529057a 100644
--- a/ext/testcase.c
+++ b/ext/testcase.c
@@ -2448,7 +2448,10 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res
}
}
if (resultp)
+ {
+ solv_free(*resultp);
*resultp = result;
+ }
else
solv_free(result);
if (resultflagsp)
--
2.27.0

View File

@ -1,30 +0,0 @@
From 2b5e6c28be7dffe1a3b5e90a35c5ee425c08aeb0 Mon Sep 17 00:00:00 2001
From: niner <nine@detonation.org>
Date: Tue, 8 Feb 2022 18:10:54 +0100
Subject: [PATCH] Fix segfault on conflict resolution when using bindings
Solutionelement objects were created with a wrong solutionid (i.e. the
solution element id was used for the solutionid field). This led to invalid
array indexes when trying to read the extraflags which then escalated
into a segfault. Fix by setting solutionid correctly in the Solutionelement
constructor.
---
bindings/solv.i | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bindings/solv.i b/bindings/solv.i
index 3a6bac46..1d35bf61 100644
--- a/bindings/solv.i
+++ b/bindings/solv.i
@@ -3411,7 +3411,7 @@ returnself(matchsolvable)
e = solv_calloc(1, sizeof(*e));
e->solv = solv;
e->problemid = problemid;
- e->solutionid = id;
+ e->solutionid = solutionid;
e->id = id;
e->type = type;
e->p = p;
--
2.27.0

View File

@ -0,0 +1,26 @@
From 47734e26d67ad236a29c160ff224fcb1910e3a6f Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Tue, 18 Apr 2023 12:36:40 +0200
Subject: [PATCH] Add testcase for last commit
---
test/testcases/cplxdeps/ifelse_rec.t | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 test/testcases/cplxdeps/ifelse_rec.t
diff --git a/test/testcases/cplxdeps/ifelse_rec.t b/test/testcases/cplxdeps/ifelse_rec.t
new file mode 100644
index 000000000..ea467027c
--- /dev/null
+++ b/test/testcases/cplxdeps/ifelse_rec.t
@@ -0,0 +1,10 @@
+repo appstream 0 testtags <inline>
+#>=Pkg: xorg-x11-server-Xorg 1.20.11 18.el9 noarch
+#>=Req: missing-req
+#>=Pkg: pass 1.7.4 6.el9 noarch
+#>=Rec: xclip <IF> (xorg-x11-server-Xorg <ELSE> wl-clipboard)
+repo @System 0 empty
+system unset * @System
+job install pkg pass-1.7.4-6.el9.noarch@appstream
+result transaction,problems <inline>
+#>install pass-1.7.4-6.el9.noarch@appstream

View File

@ -0,0 +1,69 @@
From 2c4ee52a948a9ccff2242cd02ac8ce81a0559deb Mon Sep 17 00:00:00 2001
From: David Cantrell <dcantrell@redhat.com>
Date: Tue, 26 Mar 2024 12:13:55 -0400
Subject: [PATCH] Fix a couple small static analysis findings for uninitialized
structs
The memset() on the KeyValue is more explicit even though if you trace
the code you will see it fills out the struct. However, it's possible
that not every struct member will be initialized and adding the
memset() makes things more obvious and appeases the static analyzer.
Conflict:NA
Reference:https://github.com/openSUSE/libsolv/commit/2c4ee52a948a9ccff2242cd02ac8ce81a0559deb.patch
---
ext/repo_rpmmd.c | 2 ++
ext/repo_susetags.c | 1 +
ext/testcase.c | 3 +++
3 files changed, 6 insertions(+)
diff --git a/ext/repo_rpmmd.c b/ext/repo_rpmmd.c
index 1232e43..5d0f5fe 100644
--- a/ext/repo_rpmmd.c
+++ b/ext/repo_rpmmd.c
@@ -609,6 +609,8 @@ fill_cshash_from_new_solvables(struct parsedata *pd)
KeyValue kv;
Repokey *key;
+ memset(&kv, 0, sizeof(kv));
+
for (i = pd->first; i < pool->nsolvables; i++)
{
if (pool->solvables[i].repo != pd->repo)
diff --git a/ext/repo_susetags.c b/ext/repo_susetags.c
index dc60aa4..86bb1e9 100644
--- a/ext/repo_susetags.c
+++ b/ext/repo_susetags.c
@@ -339,6 +339,7 @@ lookup_shared_id(Repodata *data, Id p, Id keyname, Id voidid, int uninternalized
if (uninternalized)
{
KeyValue kv;
+ memset(&kv, 0, sizeof(kv));
Repokey *key = repodata_lookup_kv_uninternalized(data, p, keyname, &kv);
if (!key)
return 0;
diff --git a/ext/testcase.c b/ext/testcase.c
index f46f738..3e22546 100644
--- a/ext/testcase.c
+++ b/ext/testcase.c
@@ -1440,6 +1440,7 @@ testcase_solverresult(Solver *solv, int resultflags)
{
Queue q;
+
queue_init(&q);
solver_get_orphaned(solv, &q);
for (i = 0; i < q.count; i++)
@@ -1497,6 +1498,8 @@ testcase_solverresult(Solver *solv, int resultflags)
if ((resultflags & TESTCASE_RESULT_USERINSTALLED) != 0)
{
Queue q;
+
+ queue_init(&q);
solver_get_userinstalled(solv, &q, 0);
for (i = 0; i < q.count; i++)
{
--
2.9.3.windows.1

View File

@ -0,0 +1,72 @@
From bbd1801748e74259f7d8d7d7eee369064961962b Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Tue, 13 Feb 2024 15:25:47 +0100
Subject: [PATCH] Handle installed packages in three passes
Fixes issue #550
Conflict:NA
Reference:https://github.com/openSUSE/libsolv/commit/bbd1801748e74259f7d8d7d7eee369064961962b
---
src/solver.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/src/solver.c b/src/solver.c
index 741aa1b2f..a1a41f677 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -1836,7 +1836,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
{
Pool *pool = solv->pool;
Repo *installed = solv->installed;
- int i, n, pass;
+ int i, n, pass, startpass;
int installedpos = solv->installedpos;
Solvable *s;
Id p, pp;
@@ -1845,10 +1845,14 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
POOL_DEBUG(SOLV_DEBUG_SOLVER, "resolving installed packages\n");
if (!installedpos)
installedpos = installed->start;
- /* we use two passes if we need to update packages
- * to create a better user experience */
- for (pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1; pass < 2; )
+ /* we use passes if we need to update packages to create a better user experience:
+ * pass 0: update the packages requested by the user
+ * pass 1: keep the installed packages if we can
+ * pass 2: update the packages that could not be kept */
+ startpass = solv->updatemap_all ? 2 : solv->updatemap.size ? 0 : 1;
+ for (pass = startpass; pass < 3; )
{
+ int needpass2 = 0;
int passlevel = level;
Id *specialupdaters = solv->specialupdaters;
/* start with installedpos, the position that gave us problems the last time */
@@ -1880,6 +1884,11 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
* the installed package and not replace it with a newer version */
if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
{
+ if (pass == 1)
+ {
+ needpass2 = 1; /* first do the packages we do not want/need to update */
+ continue;
+ }
if (dq->count)
queue_empty(dq);
/* find update candidates */
@@ -1964,12 +1973,14 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
if (level < origlevel)
break; /* ran into trouble */
/* re-run all passes */
- pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1;
+ pass = startpass;
continue;
}
/* reset installedpos, advance to next pass */
installedpos = installed->start;
pass++;
+ if (pass == 2 && !needpass2)
+ break;
}
solv->installedpos = installedpos;
return level;

View File

@ -0,0 +1,192 @@
From 4c7ce065280f062c52ae19d75344c49e5f562108 Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Tue, 13 Feb 2024 14:42:25 +0100
Subject: [PATCH] Move special updaters handling into its own function
Conflict:NA
Reference:https://github.com/openSUSE/libsolv/commit/4c7ce065280f062c52ae19d75344c49e5f562108
---
src/solver.c | 127 ++++++++++++++++++++++++++++-----------------------
1 file changed, 71 insertions(+), 56 deletions(-)
diff --git a/src/solver.c b/src/solver.c
index 0c3333d87..741aa1b2f 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -1788,6 +1788,49 @@ prune_to_update_targets(Solver *solv, Id *cp, Queue *q)
queue_truncate(q, j);
}
+static void
+get_special_updaters(Solver *solv, int i, Rule *rr, Queue *dq)
+{
+ Pool *pool = solv->pool;
+ Repo *installed = solv->installed;
+ int specoff = solv->specialupdaters[i - installed->start];
+ int j, d;
+ Id p;
+
+ /* special multiversion handling, make sure best version is chosen */
+ if (rr->p == i && solv->decisionmap[i] >= 0)
+ queue_push(dq, i);
+ for (d = specoff; (p = pool->whatprovidesdata[d]) != 0; d++)
+ if (solv->decisionmap[p] >= 0)
+ queue_push(dq, p);
+ /* if we have installed packages try to find identical ones to get
+ * repo priorities. see issue #343 */
+ for (j = 0; j < dq->count; j++)
+ {
+ Id p2 = dq->elements[j];
+ if (pool->solvables[p2].repo != installed)
+ continue;
+ for (d = specoff; (p = pool->whatprovidesdata[d]) != 0; d++)
+ {
+ if (solv->decisionmap[p] >= 0 || pool->solvables[p].repo == installed)
+ continue;
+ if (solvable_identical(pool->solvables + p, pool->solvables + p2))
+ queue_push(dq, p); /* identical to installed, put it on the list so we have a repo prio */
+ }
+ }
+ if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
+ prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
+ if (dq->count)
+ {
+ policy_filter_unwanted(solv, dq, POLICY_MODE_CHOOSE);
+ p = dq->elements[0];
+ if (p != i && solv->decisionmap[p] == 0)
+ dq->count = 1;
+ else
+ dq->count = 0;
+ }
+}
+
static int
resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
{
@@ -1804,7 +1847,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
installedpos = installed->start;
/* we use two passes if we need to update packages
* to create a better user experience */
- for (pass = solv->updatemap.size ? 0 : 1; pass < 2; )
+ for (pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1; pass < 2; )
{
int passlevel = level;
Id *specialupdaters = solv->specialupdaters;
@@ -1812,7 +1855,6 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
for (i = installedpos, n = installed->start; n < installed->end; i++, n++)
{
Rule *r, *rr;
- Id d;
if (i == installed->end)
i = installed->start;
@@ -1836,48 +1878,20 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
/* check if we should update this package to the latest version
* noupdate is set for erase jobs, in that case we want to deinstall
* the installed package and not replace it with a newer version */
- if (dq->count)
- queue_empty(dq);
if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
{
- if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
+ if (dq->count)
+ queue_empty(dq);
+ /* find update candidates */
+ if (specialupdaters && specialupdaters[i - installed->start] != 0)
{
- int j;
- /* special multiversion handling, make sure best version is chosen */
- if (rr->p == i && solv->decisionmap[i] >= 0)
- queue_push(dq, i);
- while ((p = pool->whatprovidesdata[d++]) != 0)
- if (solv->decisionmap[p] >= 0)
- queue_push(dq, p);
- for (j = 0; j < dq->count; j++)
- {
- Id p2 = dq->elements[j];
- if (pool->solvables[p2].repo != installed)
- continue;
- d = specialupdaters[i - installed->start];
- while ((p = pool->whatprovidesdata[d++]) != 0)
- {
- if (solv->decisionmap[p] >= 0 || pool->solvables[p].repo == installed)
- continue;
- if (solvable_identical(pool->solvables + p, pool->solvables + p2))
- queue_push(dq, p); /* identical to installed, put it on the list so we have a repo prio */
- }
- }
- if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
- prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
+ get_special_updaters(solv, i, rr, dq);
+ /* if we have an update set rr to the feature rule */
if (dq->count)
{
- policy_filter_unwanted(solv, dq, POLICY_MODE_CHOOSE);
- p = dq->elements[0];
- if (p != i && solv->decisionmap[p] == 0)
- {
- rr = solv->rules + solv->featurerules + (i - solv->installed->start);
- if (!rr->p) /* update rule == feature rule? */
- rr = rr - solv->featurerules + solv->updaterules;
- dq->count = 1;
- }
- else
- dq->count = 0;
+ rr = solv->rules + solv->featurerules + (i - solv->installed->start);
+ if (!rr->p) /* update rule == feature rule? */
+ rr = rr - solv->featurerules + solv->updaterules;
}
}
else
@@ -1894,24 +1908,25 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
queue_push(dq, p);
}
}
- }
- if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
- prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
- /* install best version */
- if (dq->count)
- {
- olevel = level;
- level = selectandinstall(solv, level, dq, disablerules, rr - solv->rules, SOLVER_REASON_UPDATE_INSTALLED);
- if (level <= olevel)
+ if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
+ prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
+ /* install best version */
+ if (dq->count)
{
- if (level < passlevel)
- break; /* trouble */
- if (level < olevel)
- n = installed->start; /* redo all */
- i--;
- n--;
- continue;
+ olevel = level;
+ level = selectandinstall(solv, level, dq, disablerules, rr - solv->rules, SOLVER_REASON_UPDATE_INSTALLED);
+ if (level <= olevel)
+ {
+ if (level < passlevel)
+ break; /* trouble */
+ if (level < olevel)
+ n = installed->start; /* redo all */
+ i--;
+ n--;
+ continue;
+ }
}
+ /* check original package even if we installed an update */
}
/* if still undecided keep package */
if (solv->decisionmap[i] == 0)
@@ -1949,7 +1964,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
if (level < origlevel)
break; /* ran into trouble */
/* re-run all passes */
- pass = solv->updatemap.size ? 0 : 1;
+ pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1;
continue;
}
/* reset installedpos, advance to next pass */

View File

@ -0,0 +1,27 @@
From 1edb35a3bd9abcede3a200471a4d1868f8054c99 Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Tue, 18 Apr 2023 11:57:50 +0200
Subject: [PATCH] Treat condition both as positive and negative literal in
pool_add_pos_literals_complex_dep
That's because (A IF B ELSE C) gets rewritten to (A OR ~B) AND (C OR B) and
(A UNLESS B ELSE C) gets rewritten to (A AND ~B) OR (C AND B). In both
cases we have A, B, ~B, C.
This resolves issue #527
---
src/cplxdeps.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/cplxdeps.c b/src/cplxdeps.c
index 6c40752e2..26e754d95 100644
--- a/src/cplxdeps.c
+++ b/src/cplxdeps.c
@@ -405,6 +405,7 @@ pool_add_pos_literals_complex_dep(Pool *pool, Id dep, Queue *q, Map *m, int neg)
Reldep *rd2 = GETRELDEP(pool, rd->evr);
if (rd2->flags == REL_ELSE)
{
+ pool_add_pos_literals_complex_dep(pool, rd2->name, q, m, !neg);
pool_add_pos_literals_complex_dep(pool, rd2->evr, q, m, !neg);
dep = rd2->name;
}

View File

@ -0,0 +1,50 @@
From 2c85ed581422e072ad95119f3d7dc19eb45f29ac Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Fri, 19 May 2023 15:17:53 +0200
Subject: [PATCH] choice rules: also do solver_choicerulecheck for package
downgrades
Fixes issue #514
---
src/rules.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/rules.c b/src/rules.c
index 660656f01..7d57cfdee 100644
--- a/src/rules.c
+++ b/src/rules.c
@@ -3449,6 +3449,7 @@ solver_addchoicerules(Solver *solv)
int lastaddedcnt;
unsigned int now;
int isinstalled;
+ int dodowngradecheck = solv->allowdowngrade;
solv->choicerules = solv->nrules;
if (!pool->installed)
@@ -3457,6 +3458,8 @@ solver_addchoicerules(Solver *solv)
return;
}
now = solv_timems(0);
+ if ((solv->dupinvolvedmap_all || solv->dupinvolvedmap.size) && solv->dup_allowdowngrade)
+ dodowngradecheck = 1;
queue_init(&q);
queue_init(&qi);
queue_init(&qcheck);
@@ -3532,8 +3535,16 @@ solver_addchoicerules(Solver *solv)
/* do extra checking for packages related to installed packages */
for (i = j = 0; i < qi.count; i += 2)
{
+ int isdowngrade = 0;
p2 = qi.elements[i];
- if (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, p2 - solv->installed->start)))
+ if (dodowngradecheck)
+ {
+ p = qi.elements[i + 1];
+ if (pool->solvables[p2].name == pool->solvables[p].name)
+ if (pool_evrcmp(pool, pool->solvables[p2].evr, pool->solvables[p].evr, EVRCMP_COMPARE) > 0)
+ isdowngrade = 1;
+ }
+ if (isdowngrade || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, p2 - solv->installed->start)))
{
if (solver_choicerulecheck(solv, p2, r, &m, &qcheck))
continue;

View File

@ -0,0 +1,32 @@
From 553c69b514c1ca85a6311373b48c6096886dcff3 Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Tue, 13 Feb 2024 12:43:50 +0100
Subject: [PATCH] resolve_installed: remove dead code
Since we simplified our dup handling the update rules always
start with the installed package.
Conflict:NA
Reference:https://github.com/openSUSE/libsolv/commit/553c69b514c1ca85a6311373b48c6096886dcff3
---
src/solver.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/solver.c b/src/solver.c
index 363d88734..0c3333d87 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -1835,11 +1835,10 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
/* check if we should update this package to the latest version
* noupdate is set for erase jobs, in that case we want to deinstall
- * the installed package and not replace it with a newer version
- * rr->p != i is for dup jobs where the installed package cannot be kept */
+ * the installed package and not replace it with a newer version */
if (dq->count)
queue_empty(dq);
- if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || (rr->p && rr->p != i)))
+ if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
{
if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
{

View File

@ -1,30 +0,0 @@
From dd6e977782816e330a8f60cf78ca3d12fead3b10 Mon Sep 17 00:00:00 2001
From: Jon Turney <jon.turney@dronecode.org.uk>
Date: Sun, 14 Aug 2022 18:45:20 +0100
Subject: [PATCH] Ensure duplinvolvedmap_all is reset when a solver is reused
Otherwise, if solver is used with a SOLVER_DISTUPGRADE job, then reused
without one, this will cause solver_addduprules() to be called, even
though needduprules is 0, which will crash trying to dereference
solv->dupmap, which is NULL because solver_createdupmaps() hasn't been
called.
Conflict:NA
Reference:https://github.com/openSUSE/libsolv/commit/dd6e977782816e330a8f60cf78ca3d12fead3b10
---
src/solver.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/solver.c b/src/solver.c
index 28341d6d3..e3779e232 100644
--- a/src/solver.c
+++ b/src/solver.c
@@ -3533,6 +3533,7 @@ solver_solve(Solver *solv, Queue *job)
map_zerosize(&solv->bestupdatemap);
solv->fixmap_all = 0;
map_zerosize(&solv->fixmap);
+ solv->dupinvolvedmap_all = 0;
map_zerosize(&solv->dupmap);
map_zerosize(&solv->dupinvolvedmap);
solv->process_orphans = 0;

View File

@ -14,16 +14,20 @@
%bcond_without conda
Name: libsolv
Version: 0.7.20
Version: 0.7.24
Release: 3
Summary: Package dependency solver
License: BSD
URL: https://github.com/openSUSE/libsolv
Source: https://github.com/openSUSE/libsolv/archive/refs/tags/%{version}.tar.gz
Patch0: Fix-segfault-on-conflict-resolution-when-using-bindi.patch
Patch1: Fix-memory-leak-when-using-testsolv-to-execute-cases.patch
Patch2: ensure-duplinvolvedmap_all-is-reset.patch
Patch6001: backport-Treat-condition-both-as-positive-and-negative-literal-in-pool_add_pos_literals_complex_dep.patch
Patch6002: backport-Add-testcase-for-last-commit.patch
Patch6003: backport-choice-rules-also-do-solver_choicerulecheck-for-package-downgrades.patch
Patch6004: backport-Fix-a-couple-small-static-analysis-findings-for-uninitialized-structs.patch
Patch6005: backport-resolve_installed-remove-dead-code.patch
Patch6006: backport-Move-special-updaters-handling-into-its-own-function.patch
Patch6007: backport-Handle-installed-packages-in-three-passes.patch
BuildRequires: cmake gcc-c++ ninja-build pkgconfig(rpm) zlib-devel
BuildRequires: libxml2-devel xz-devel bzip2-devel
@ -56,7 +60,7 @@ Development files for %{name}.
%package tools
Summary: Package dependency solver tools
Requires: %{name} = %{version}-%{release}
Requires: %{_bindir}/find
Requires: /usr/bin/find
%description tools
Package dependency solver tools.
@ -217,6 +221,27 @@ Python 3 version.
%{_mandir}/man3/%{name}*.3*
%changelog
* Tue Jul 23 2024 LuWu <2398491106@qq.com> - 0.7.24-3
- Handle installed packages in three passes
* Tue Jun 18 2024 guojunding <guojunding@kylinos.cn> - 0.7.24-2
- Fix a couple small static analysis findings for uninitialized structs
* Sun Feb 4 2024 hanhuihui<hanhuihui5@huawei.com> - 0.7.24-1
- DESC:update libsolv to 0.7.24-1
* Sat Aug 19 2023 hanhuihui<hanhuihui5@huawei.com> - 0.7.22-2
- Type:bugfix
- ID:NA
- SUG:NA
- DESC:fix requirement error
* Tue Nov 8 2022 hanhuihui<hanhuihui5@huawei.com> - 0.7.22-1
- Type:bugfix
- ID:NA
- SUG:NA
- DESC:update libsolv to 0.7.22-1
* Fri Oct 21 2022 hanhuihui<hanhuihui5@huawei.com> - 0.7.20-3
- Type:bugfix
- ID:NA