[SATYR PATCH] Fix segfault in sr_rpm_package_uniq

Martin Milata mmilata at redhat.com
Tue May 14 10:05:08 UTC 2013


Signed-off-by: Martin Milata <mmilata at redhat.com>
---
 lib/rpm.c    | 13 +++++++---
 tests/rpm.at | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 3 deletions(-)

diff --git a/lib/rpm.c b/lib/rpm.c
index 9a553b0..200ae9d 100644
--- a/lib/rpm.c
+++ b/lib/rpm.c
@@ -224,13 +224,20 @@ sr_rpm_package_uniq(struct sr_rpm_package *packages)
             }
             else
             {
+                /* deleted record is not the first in list */
                 if (prev)
+                {
                     prev->next = loop->next;
+                    sr_rpm_package_free(loop, false);
+                    loop = prev->next;
+                }
+                /* deleting first record */
                 else
+                {
                     packages = loop->next;
-
-                sr_rpm_package_free(loop, false);
-                loop = prev->next;
+                    sr_rpm_package_free(loop, false);
+                    loop = packages;
+                }
             }
 
             continue;
diff --git a/tests/rpm.at b/tests/rpm.at
index 638c9c0..bc683e6 100644
--- a/tests/rpm.at
+++ b/tests/rpm.at
@@ -79,3 +79,80 @@ main(void)
   return 0;
 }
 ]])
+
+## ------------------- ##
+## sr_rpm_package_uniq ##
+## ------------------- ##
+AT_TESTFUN([sr_rpm_package_uniq],
+[[
+#include <lib/rpm.h>
+#include <lib/utils.h>
+#include <assert.h>
+#include <stdint.h>
+
+int
+main(void)
+{
+  struct sr_rpm_package *p1 = sr_rpm_package_new();
+  struct sr_rpm_package *p2 = sr_rpm_package_new();
+  struct sr_rpm_package *p3 = sr_rpm_package_new();
+
+  p1->name = sr_strdup("coreutils");
+  p1->version = sr_strdup("8.15");
+  p1->release = sr_strdup("10.fc17");
+  p1->next = p2;
+
+  p2->name = sr_strdup("coreutils");
+  p2->version = sr_strdup("8.15");
+  p2->release = sr_strdup("10.fc17");
+  p2->architecture = sr_strdup("x86_64");
+  p2->install_time = 1363628422;
+  p2->next = p3;
+
+  p3->name = sr_strdup("glibc");
+  p3->version = sr_strdup("2.15");
+  p3->release = sr_strdup("58.fc17");
+  p3->architecture = sr_strdup("x86_64");
+  p3->install_time = 1363628422;
+
+  struct sr_rpm_package *packages = p1;
+  packages = sr_rpm_package_uniq(packages);
+
+  assert(packages == p2);
+  assert(packages->next == p3);
+  assert(packages->next->next == NULL);
+
+  sr_rpm_package_free(packages, true);
+
+  p1 = sr_rpm_package_new();
+  p2 = sr_rpm_package_new();
+  p3 = sr_rpm_package_new();
+
+  p1->name = sr_strdup("glibc");
+  p1->version = sr_strdup("2.15");
+  p1->release = sr_strdup("58.fc17");
+  p1->architecture = sr_strdup("x86_64");
+  p1->install_time = 1363628422;
+  p1->next = p2;
+
+  p2->name = sr_strdup("coreutils");
+  p2->version = sr_strdup("8.15");
+  p2->release = sr_strdup("10.fc17");
+  p2->next = p3;
+
+  p3->name = sr_strdup("coreutils");
+  p3->version = sr_strdup("8.15");
+  p3->release = sr_strdup("10.fc17");
+  p3->architecture = sr_strdup("x86_64");
+  p3->install_time = 1363628422;
+
+  packages = p1;
+  packages = sr_rpm_package_uniq(packages);
+
+  assert(packages == p1);
+  assert(packages->next == p3);
+  assert(packages->next->next == NULL);
+
+  return 0;
+}
+]])
-- 
1.7.11.7



More information about the Crash-catcher mailing list