[SATYR PATCH] abrt: parse kernel package version

Martin Milata mmilata at redhat.com
Tue May 14 10:56:11 UTC 2013


Signed-off-by: Martin Milata <mmilata at redhat.com>
---
 lib/abrt.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 42 insertions(+), 6 deletions(-)

diff --git a/lib/abrt.c b/lib/abrt.c
index edcbc6b..803455e 100644
--- a/lib/abrt.c
+++ b/lib/abrt.c
@@ -312,13 +312,16 @@ sr_abrt_report_from_dir(const char *directory,
     free(component_filename);
 
     /* RPM packages. */
-    report->rpm_packages = sr_abrt_rpm_packages_from_dir(
-        directory, error_message);
-
-    if (!report->rpm_packages)
+    if (report->report_type != SR_REPORT_KERNELOOPS)
     {
-        sr_report_free(report);
-        return NULL;
+        report->rpm_packages = sr_abrt_rpm_packages_from_dir(
+            directory, error_message);
+
+        if (!report->rpm_packages)
+        {
+            sr_report_free(report);
+            return NULL;
+        }
     }
 
     /* Core stacktrace. */
@@ -399,6 +402,39 @@ sr_abrt_report_from_dir(const char *directory,
     /* Kerneloops stacktrace. */
     if (report->report_type == SR_REPORT_KERNELOOPS)
     {
+        /* Determine kernel version */
+        char *kernel_filename = sr_build_path(directory,
+                                              "kernel",
+                                              NULL);
+        char *kernel_contents = sr_file_to_string(kernel_filename,
+                                                  error_message);
+        free(kernel_filename);
+        if (!kernel_contents)
+        {
+            sr_report_free(report);
+            return NULL;
+        }
+
+        char *kernel_nevra = sr_asprintf("kernel-%s", kernel_contents);
+        struct sr_rpm_package *package = sr_rpm_package_new();
+        bool success = sr_rpm_package_parse_nevra(kernel_nevra,
+                                                  &package->name,
+                                                  &package->epoch,
+                                                  &package->version,
+                                                  &package->release,
+                                                  &package->architecture);
+        if (!success)
+        {
+            sr_rpm_package_free(package, true);
+            *error_message = sr_asprintf("Failed to parse \"%s\".",
+                                         kernel_nevra);
+
+            sr_report_free(report);
+            return NULL;
+        }
+        report->rpm_packages = package;
+
+        /* Load the Kerneloops stacktrace */
         char *backtrace_filename = sr_build_path(directory,
                                                  "backtrace",
                                                  NULL);
-- 
1.7.11.7



More information about the Crash-catcher mailing list