summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJo-Philipp Wich2019-01-17 20:37:09 +0000
committerJo-Philipp Wich2019-01-17 20:37:09 +0000
commit9dd9a07600593cdbdfc4186bc5105bd6e40dbe1f (patch)
treeb51db0892642d298caf9c5ff0eb1d57d44ebe5bb
parent89fe77cb119a24f728088320d66d51250a1f02ab (diff)
downloadopkg-lede-9dd9a07600593cdbdfc4186bc5105bd6e40dbe1f.tar.gz
libopkg: fix segmentation fault when traversing conflicts
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--libopkg/pkg_depends.c45
1 files changed, 14 insertions, 31 deletions
diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
index 9fc7251..748b599 100644
--- a/libopkg/pkg_depends.c
+++ b/libopkg/pkg_depends.c
@@ -466,20 +466,14 @@ int pkg_replaces(pkg_t * pkg, pkg_t * replacee)
*/
int pkg_conflicts_abstract(pkg_t * pkg, abstract_pkg_t * conflictee)
{
- compound_depend_t *conflicts, *conflict;
-
- conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
+ int i, j;
+ compound_depend_t *conflicts;
- int j;
- for (conflict = conflicts; conflict->type; conflict++) {
- int possibility_count = conflict->possibility_count;
- struct depend **possibilities = conflict->possibilities;
- for (j = 0; j < possibility_count; j++) {
- if (possibilities[j]->pkg == conflictee) {
+ for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+ for (j = 0; j < conflicts[i].possibility_count; j++)
+ if (conflicts[i].possibilities[j]->pkg == conflictee)
return 1;
- }
- }
- }
+
return 0;
}
@@ -489,27 +483,16 @@ int pkg_conflicts_abstract(pkg_t * pkg, abstract_pkg_t * conflictee)
*/
int pkg_conflicts(pkg_t * pkg, pkg_t * conflictee)
{
- int j;
- int possibility_count;
- struct depend **possibilities;
- compound_depend_t *conflicts, *conflict;
- abstract_pkg_t **conflictee_provides, **provider, *possibility;
+ int i, j;
+ compound_depend_t *conflicts;
+ abstract_pkg_t **provider;
- conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
- conflictee_provides = pkg_get_ptr(conflictee, PKG_PROVIDES);
-
- for (conflict = conflicts; conflict->type; conflict++) {
- possibility_count = conflict->possibility_count;
- possibilities = conflict->possibilities;
- for (j = 0; j < possibility_count; j++) {
- possibility = possibilities[j]->pkg;
- for (provider = conflictee_provides; provider && *provider; provider++) {
- if (possibility == *provider) {
+ for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+ for (j = 0; j < conflicts[i].possibility_count; j++)
+ for (provider = pkg_get_ptr(conflictee, PKG_PROVIDES); provider && *provider; provider++)
+ if (conflicts[i].possibilities[j]->pkg == *provider)
return 1;
- }
- }
- }
- }
+
return 0;
}