Nikola Pajkovsky 926a04
From 446bc2d3798d34a4b552deea2ada35589286b2da Mon Sep 17 00:00:00 2001
Nikola Pajkovsky 926a04
Message-Id: <446bc2d3798d34a4b552deea2ada35589286b2da.1317997521.git.npajkovs@redhat.com>
Nikola Pajkovsky 926a04
From: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 926a04
Date: Fri, 7 Oct 2011 16:25:10 +0200
Nikola Pajkovsky 926a04
Subject: [PATCH] not send tainted kernel and broken bios
Nikola Pajkovsky 926a04
Nikola Pajkovsky 926a04
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 926a04
---
Nikola Pajkovsky 926a04
 src/gui-gtk/main.c           |   12 +++++++-
Nikola Pajkovsky 926a04
 src/plugins/abrt-dump-oops.c |   57 ++++++++++++++++++++---------------------
Nikola Pajkovsky 926a04
 2 files changed, 38 insertions(+), 31 deletions(-)
Nikola Pajkovsky 926a04
Nikola Pajkovsky 926a04
diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c
Nikola Pajkovsky 926a04
index 2e45090..02a9cfc 100644
Nikola Pajkovsky 926a04
--- a/src/gui-gtk/main.c
Nikola Pajkovsky 926a04
+++ b/src/gui-gtk/main.c
Nikola Pajkovsky 926a04
@@ -73,13 +73,20 @@ static void add_directory_to_dirlist(const char *dirname)
Nikola Pajkovsky 926a04
     );
Nikola Pajkovsky 926a04
     const char *reported = (msg ? GTK_STOCK_YES : GTK_STOCK_NO);
Nikola Pajkovsky 926a04
     free(msg);
Nikola Pajkovsky 926a04
-    char *reason = dd_load_text(dd, FILENAME_REASON);
Nikola Pajkovsky 926a04
+
Nikola Pajkovsky 926a04
+    char *not_reportable_reason = dd_load_text_ext(dd, FILENAME_NOT_REPORTABLE, 0
Nikola Pajkovsky 926a04
+                                                   | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
Nikola Pajkovsky 926a04
+                                                   | DD_FAIL_QUIETLY_ENOENT
Nikola Pajkovsky 926a04
+                                                   | DD_FAIL_QUIETLY_EACCES);
Nikola Pajkovsky 926a04
+    char *reason = NULL;
Nikola Pajkovsky 926a04
+    if (!not_reportable_reason)
Nikola Pajkovsky 926a04
+        reason = dd_load_text(dd, FILENAME_REASON);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
     GtkTreeIter iter;
Nikola Pajkovsky 926a04
     gtk_list_store_append(s_dumps_list_store, &iter);
Nikola Pajkovsky 926a04
     gtk_list_store_set(s_dumps_list_store, &iter,
Nikola Pajkovsky 926a04
                           COLUMN_REPORTED, reported,
Nikola Pajkovsky 926a04
-                          COLUMN_REASON, reason,
Nikola Pajkovsky 926a04
+                          COLUMN_REASON, not_reportable_reason? :reason,
Nikola Pajkovsky 926a04
                           COLUMN_DIRNAME, dd->dd_dirname,
Nikola Pajkovsky 926a04
                           //OPTION: time format
Nikola Pajkovsky 926a04
                           COLUMN_LATEST_CRASH_STR, time_buf,
Nikola Pajkovsky 926a04
@@ -87,6 +94,7 @@ static void add_directory_to_dirlist(const char *dirname)
Nikola Pajkovsky 926a04
                           COLUMN_DUMP_DIR, dirname,
Nikola Pajkovsky 926a04
                           -1);
Nikola Pajkovsky 926a04
     free(reason);
Nikola Pajkovsky 926a04
+    free(not_reportable_reason);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
     dd_close(dd);
Nikola Pajkovsky 926a04
     VERB1 log("added: %s", dirname);
Nikola Pajkovsky 926a04
diff --git a/src/plugins/abrt-dump-oops.c b/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 926a04
index b43d507..05c62b0 100644
Nikola Pajkovsky 926a04
--- a/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 926a04
+++ b/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 926a04
@@ -480,16 +480,6 @@ static unsigned save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
     VERB1 log("Saving %u oopses as dump dirs", idx >= countdown ? countdown-1 : idx);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
-    char *tainted_str = NULL;
Nikola Pajkovsky 926a04
-    FILE *tainted_fp = fopen("/proc/sys/kernel/tainted", "r");
Nikola Pajkovsky 926a04
-    if (tainted_fp)
Nikola Pajkovsky 926a04
-    {
Nikola Pajkovsky 926a04
-        tainted_str = xmalloc_fgetline(tainted_fp);
Nikola Pajkovsky 926a04
-        fclose(tainted_fp);
Nikola Pajkovsky 926a04
-    }
Nikola Pajkovsky 926a04
-    else
Nikola Pajkovsky 926a04
-        perror_msg("Can't open '%s'", "/proc/sys/kernel/tainted");
Nikola Pajkovsky 926a04
-
Nikola Pajkovsky 926a04
     char *cmdline_str = NULL;
Nikola Pajkovsky 926a04
     FILE *cmdline_fp = fopen("/proc/cmdline", "r");
Nikola Pajkovsky 926a04
     if (cmdline_fp)
Nikola Pajkovsky 926a04
@@ -535,27 +525,29 @@ static unsigned save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
Nikola Pajkovsky 926a04
             if (cmdline_str)
Nikola Pajkovsky 926a04
                 dd_save_text(dd, FILENAME_CMDLINE, cmdline_str);
Nikola Pajkovsky 926a04
             dd_save_text(dd, FILENAME_BACKTRACE, second_line);
Nikola Pajkovsky 926a04
-// TODO: add "Kernel oops: " prefix, so that all oopses have recognizable FILENAME_REASON?
Nikola Pajkovsky 926a04
-// kernel oops 1st line may look quite puzzling otherwise...
Nikola Pajkovsky 926a04
-            strchrnul(second_line, '\n')[0] = '\0';
Nikola Pajkovsky 926a04
-            dd_save_text(dd, FILENAME_REASON, second_line);
Nikola Pajkovsky 926a04
-
Nikola Pajkovsky 926a04
-            if (tainted_str && tainted_str[0] != '0')
Nikola Pajkovsky 926a04
-            {
Nikola Pajkovsky 926a04
-                unsigned long tainted = xatoi_positive(tainted_str);
Nikola Pajkovsky 926a04
-                char *tainted_short = kernel_tainted_short(tainted);
Nikola Pajkovsky 926a04
-                GList *tainted_long = kernel_tainted_long(tainted);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
-                struct strbuf *tnt_long = strbuf_new();
Nikola Pajkovsky 926a04
-                for (GList *li = tainted_long; li; li = li->next)
Nikola Pajkovsky 926a04
-                    strbuf_append_strf(tnt_long, "%s\n", (char*) li->data);
Nikola Pajkovsky 926a04
+           /* check if trace doesn't have line: 'Your BIOS is broken' */
Nikola Pajkovsky 926a04
+            char *broken_bios = strstr(second_line, "Your BIOS is broken");
Nikola Pajkovsky 926a04
+            if (broken_bios)
Nikola Pajkovsky 926a04
+                dd_save_text(dd, FILENAME_NOT_REPORTABLE, "Your BIOS is broken");
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
-                dd_save_text(dd, FILENAME_TAINTED, tainted_str);
Nikola Pajkovsky 926a04
+            char *tainted_short = kernel_tainted_short(second_line);
Nikola Pajkovsky 926a04
+            if (tainted_short)
Nikola Pajkovsky 926a04
+	    {
Nikola Pajkovsky 926a04
+                VERB1 log("Kernel is tainted '%s'", tainted_short);
Nikola Pajkovsky 926a04
                 dd_save_text(dd, FILENAME_TAINTED_SHORT, tainted_short);
Nikola Pajkovsky 926a04
-                dd_save_text(dd, FILENAME_TAINTED_LONG, tnt_long->buf);
Nikola Pajkovsky 926a04
-                strbuf_free(tnt_long);
Nikola Pajkovsky 926a04
-                list_free_with_free(tainted_long);
Nikola Pajkovsky 926a04
+                char *reason = xasprintf("Your kernel is tainted by flags '%s'. "
Nikola Pajkovsky 926a04
+                                         "Kernel maintainers are not interesting about "
Nikola Pajkovsky 926a04
+                                         "tainted kernel, because the trace might not be showing "
Nikola Pajkovsky 926a04
+                                         "the root problem."
Nikola Pajkovsky 926a04
+                                         , tainted_short);
Nikola Pajkovsky 926a04
+                dd_save_text(dd, FILENAME_NOT_REPORTABLE, reason);
Nikola Pajkovsky 926a04
+                free(reason);
Nikola Pajkovsky 926a04
             }
Nikola Pajkovsky 926a04
+// TODO: add "Kernel oops: " prefix, so that all oopses have recognizable FILENAME_REASON?
Nikola Pajkovsky 926a04
+// kernel oops 1st line may look quite puzzling otherwise...
Nikola Pajkovsky 926a04
+            strchrnul(second_line, '\n')[0] = '\0';
Nikola Pajkovsky 926a04
+            dd_save_text(dd, FILENAME_REASON, second_line);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
             dd_close(dd);
Nikola Pajkovsky 926a04
         }
Nikola Pajkovsky 926a04
@@ -563,7 +555,6 @@ static unsigned save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
Nikola Pajkovsky 926a04
             errors++;
Nikola Pajkovsky 926a04
     }
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
-    free(tainted_str);
Nikola Pajkovsky 926a04
     free(cmdline_str);
Nikola Pajkovsky 926a04
 
Nikola Pajkovsky 926a04
     return errors;
Nikola Pajkovsky 926a04
@@ -711,7 +702,15 @@ int main(int argc, char **argv)
Nikola Pajkovsky 926a04
             {
Nikola Pajkovsky 926a04
                 int i = 0;
Nikola Pajkovsky 926a04
                 while (i < oops_cnt)
Nikola Pajkovsky 926a04
-                    printf("\nVersion: %s", (char*)g_list_nth_data(oops_list, i++));
Nikola Pajkovsky 926a04
+                {
Nikola Pajkovsky 926a04
+                    char *kernel_bt = (char*)g_list_nth_data(oops_list, i++);
Nikola Pajkovsky 926a04
+                    char *tainted_short = kernel_tainted_short(kernel_bt);
Nikola Pajkovsky 926a04
+                    if (tainted_short)
Nikola Pajkovsky 926a04
+                        log("Kernel is tainted '%s'", tainted_short);
Nikola Pajkovsky 926a04
+
Nikola Pajkovsky 926a04
+                    free(tainted_short);
Nikola Pajkovsky 926a04
+                    printf("\nVersion: %s", kernel_bt);
Nikola Pajkovsky 926a04
+                }
Nikola Pajkovsky 926a04
             }
Nikola Pajkovsky 926a04
             if (opts & OPT_d)
Nikola Pajkovsky 926a04
             {
Nikola Pajkovsky 926a04
-- 
Nikola Pajkovsky 926a04
1.7.7.rc0.70.g82660
Nikola Pajkovsky 926a04