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