don't access r->p after solver_addrule is called, as it may realloc the rules
authorMichael Schroeder <mls@suse.de>
Tue, 18 Dec 2012 12:36:53 +0000 (13:36 +0100)
committerMichael Schroeder <mls@suse.de>
Tue, 18 Dec 2012 12:36:53 +0000 (13:36 +0100)
Thanks valgrind!

src/rules.c

index 9b9b8aa..f6facf4 100644 (file)
@@ -2414,14 +2414,15 @@ solver_addchoicerules(Solver *solv)
          if (i == q.count)
            continue;   /* already added that one */
        }
-
       d = q.count ? pool_queuetowhatprovides(pool, &q) : 0;
-      solver_addrule(solv, r->p, d);
-      queue_push(&solv->weakruleq, solv->nrules - 1);
-      solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
+
       lastaddedp = r->p;
       lastaddedd = d;
       lastaddedcnt = q.count;
+
+      solver_addrule(solv, r->p, d);
+      queue_push(&solv->weakruleq, solv->nrules - 1);
+      solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
 #if 0
       printf("OLD ");
       solver_printrule(solv, SOLV_DEBUG_RESULT, solv->rules + rid);