Imported Upstream version 0.7.13 upstream/0.7.13
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 27 Nov 2020 05:49:23 +0000 (14:49 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 27 Nov 2020 05:49:23 +0000 (14:49 +0900)
NEWS
VERSION.cmake
ext/repo_conda.c
package/libsolv.changes
src/repo.c
src/repodata.c

diff --git a/NEWS b/NEWS
index 9bdc2d8..7ed259d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@
 This file contains the major changes between
 libsolv versions:
 
+Version 0.7.13
+- fix solvable swapping messing up uninternalized idarrays
+
 Version 0.7.12
 - conda: support packages.conda repositories
 - conda: de-priorize track features
index ffa76f3..80aed44 100644 (file)
@@ -49,5 +49,5 @@ SET(LIBSOLVEXT_SOVERSION "1")
 
 SET(LIBSOLV_MAJOR "0")
 SET(LIBSOLV_MINOR "7")
-SET(LIBSOLV_PATCH "12")
+SET(LIBSOLV_PATCH "13")
 
index f58da0f..6e9a963 100644 (file)
@@ -64,7 +64,7 @@ parse_otherdeps(struct parsedata *pd, struct solv_jsonparser *jp, Id handle, Id
 }
 
 static int
-parse_trackfeatures(struct parsedata *pd, struct solv_jsonparser *jp, Id handle)
+parse_trackfeatures_array(struct parsedata *pd, struct solv_jsonparser *jp, Id handle)
 {
   int type = JP_ARRAY;
   while (type > 0 && (type = jsonparser_parse(jp)) > 0 && type != JP_ARRAY_END)
@@ -87,10 +87,25 @@ parse_trackfeatures(struct parsedata *pd, struct solv_jsonparser *jp, Id handle)
   return type;
 }
 
+static void
+parse_trackfeatures_string(struct parsedata *pd, const char *p, Id handle)
+{
+  const char *pe;
+  for (; *p; p++)
+    {
+      if (*p == ' ' || *p == '\t' || *p == ',')
+       continue;
+      pe = p + 1;
+      while (*pe && *pe != ' ' && *pe != '\t' && *pe != ',')
+       pe++;
+      repodata_add_idarray(pd->data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pd->pool, p, pe - p, 1));
+      p = pe - 1;
+    }
+}
+
 static void 
-swap_solvables(Repo *repo, Repodata *data, Id pa, Id pb)
+swap_solvables(Pool *pool, Repodata *data, Id pa, Id pb)
 {
-  Pool *pool = repo->pool;
   Solvable tmp; 
 
   tmp = pool->solvables[pa];
@@ -170,21 +185,9 @@ parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
          repodata_set_num(data, handle, SOLVABLE_BUILDTIME, ts);
        }
       else if (type == JP_STRING && !strcmp(jp->key, "track_features"))
-       {
-         char *p = jp->value, *pe;
-         for (; *p; p++)
-           {
-             if (*p == ' ' || *p == '\t' || *p == ',')
-               continue;
-             pe = p + 1;
-             while (*pe && *pe != ' ' && *pe != '\t' && *pe != ',')
-               pe++;
-             repodata_add_idarray(data, handle, SOLVABLE_TRACK_FEATURES, pool_strn2id(pool, p, pe - p, 1));
-             p = pe - 1;
-           }
-       }
+       parse_trackfeatures_string(pd, jp->value, handle);
       else if (type == JP_ARRAY && !strcmp(jp->key, "track_features"))
-       type = parse_trackfeatures(pd, jp, handle);
+       type = parse_trackfeatures_array(pd, jp, handle);
       else
        type = jsonparser_skip(jp, type);
     }
@@ -212,7 +215,7 @@ parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
       if (fndata[0] && fndata[0] < fntype)
        {
          /* replace old package */
-         swap_solvables(pd->repo, data, handle, fndata[1]);
+         swap_solvables(pool, data, handle, fndata[1]);
          repo_free_solvable(pd->repo, handle, 1);
          handle = fndata[1];
        }
index caccbeb..5aec357 100644 (file)
@@ -1,4 +1,10 @@
 -------------------------------------------------------------------
+Fri Apr 24 12:00:30 CEST 2020 - mls@suse.de
+
+- Fix solvable swapping messing up idarrays
+- bump version to 0.7.13
+
+-------------------------------------------------------------------
 Mon Apr 20 17:24:21 CEST 2020 - mls@suse.de
 
 - fix ruleinfo of complex dependencies returning the wrong origin
index 45e8681..b266d8d 100644 (file)
@@ -213,6 +213,8 @@ repo_free_solvable_block(Repo *repo, Id start, int count, int reuseids)
              int j;
              for (j = dstart; j < dend; j++)   
                data->attrs[j - data->start] = solv_free(data->attrs[j - data->start]);
+             if (data->lasthandle >= dstart && data->lasthandle < dend)
+               data->lasthandle = 0;
            }
          if (data->incoreoffset)
            memset(data->incoreoffset + (dstart - data->start), 0, (dend - dstart) * sizeof(Id));
index 0580cff..4e75b6d 100644 (file)
@@ -3100,6 +3100,8 @@ repodata_swap_attrs(Repodata *data, Id dest, Id src)
   tmpattrs = data->attrs[dest - data->start];
   data->attrs[dest - data->start] = data->attrs[src - data->start];
   data->attrs[src - data->start] = tmpattrs;
+  if (data->lasthandle == src || data->lasthandle == dest)
+    data->lasthandle = 0;
 }