[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