Blame 0001-rhbz-724838-don-t-file-kernel-bugs-if-tainted-B-is-s.patch

Nikola Pajkovsky 384effe
From 82b27dca87ef5a4f1cbb29377524bbdee26b1d64 Mon Sep 17 00:00:00 2001
Nikola Pajkovsky 384effe
Message-Id: <82b27dca87ef5a4f1cbb29377524bbdee26b1d64.1317979766.git.npajkovs@redhat.com>
Nikola Pajkovsky 384effe
From: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 384effe
Date: Wed, 5 Oct 2011 15:13:23 +0200
Nikola Pajkovsky 384effe
Subject: [PATCH 1/2] rhbz#724838 - don't file kernel bugs if "tainted: B" is
Nikola Pajkovsky 384effe
 set
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
Kernel maintainers are not much happy that we filling bugs when kernel
Nikola Pajkovsky 384effe
is tainted.
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
Dave Jones said
Nikola Pajkovsky 384effe
---
Nikola Pajkovsky 384effe
If something has corrupted memory, we typically see a whole bunch of things
Nikola Pajkovsky 384effe
start crashing. This leads to situations where abrt files a lot of bugs, even
Nikola Pajkovsky 384effe
though most of them are just fallout from the first.
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
an example: bugs 710925 710930 710932 710933 710935 710942 710948 710955 710956
Nikola Pajkovsky 384effe
are all the same crash. The traces and addresses are different, but 'something
Nikola Pajkovsky 384effe
scribbled over memory' is the root cause here. Sadly out of all those bugs, we
Nikola Pajkovsky 384effe
actually somehow missed the first crash which is the most relevant one. (That
Nikola Pajkovsky 384effe
one would have not had the 'Tainted: G B' text)
Nikola Pajkovsky 384effe
---
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
First part of the patch is that we won't relay on /proc/sys/kernel/tainted and
Nikola Pajkovsky 384effe
we will parse the kernel bt manually, because of reading that file after an oops
Nikola Pajkovsky 384effe
is ALWAYS going to show it as tainted.
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
Second part of the patch is that whenever you want to prohibit reporting, put a
Nikola Pajkovsky 384effe
file with name *not-reportable* into <dump-dir>. That file could be empty or with
Nikola Pajkovsky 384effe
reasonable message why are you trying to prohibit reporting.
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
All 3 reporters plugins will be respect that file and it won't try to report anything.
Nikola Pajkovsky 384effe
Reporters will show only the messages from *not-reportable* and *reason*.
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
Nikola Pajkovsky 384effe
---
Nikola Pajkovsky 384effe
 src/gui-gtk/main.c           |   16 ++++++++--
Nikola Pajkovsky 384effe
 src/plugins/abrt-dump-oops.c |   65 +++++++++++++++++++++++------------------
Nikola Pajkovsky 384effe
 2 files changed, 49 insertions(+), 32 deletions(-)
Nikola Pajkovsky 384effe
Nikola Pajkovsky 384effe
diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c
Nikola Pajkovsky 384effe
index 8172951..d11bf57 100644
Nikola Pajkovsky 384effe
--- a/src/gui-gtk/main.c
Nikola Pajkovsky 384effe
+++ b/src/gui-gtk/main.c
Nikola Pajkovsky 384effe
@@ -100,7 +100,14 @@ static void add_directory_to_dirlist(const char *dirname)
Nikola Pajkovsky 384effe
     }
Nikola Pajkovsky 384effe
     free(time_str);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
-    char *reason = dd_load_text(dd, FILENAME_REASON);
Nikola Pajkovsky 384effe
+
Nikola Pajkovsky 384effe
+    char *not_reportable_reason = dd_load_text_ext(dd, FILENAME_NOT_REPORTABLE, 0
Nikola Pajkovsky 384effe
+                                                   | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
Nikola Pajkovsky 384effe
+                                                   | DD_FAIL_QUIETLY_ENOENT
Nikola Pajkovsky 384effe
+                                                   | DD_FAIL_QUIETLY_EACCES);
Nikola Pajkovsky 384effe
+    char *reason = NULL;
Nikola Pajkovsky 384effe
+    if (!not_reportable_reason)
Nikola Pajkovsky 384effe
+        reason = dd_load_text(dd, FILENAME_REASON);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
     /* the source of the problem:
Nikola Pajkovsky 384effe
      * - first we try to load component, as we use it on Fedora
Nikola Pajkovsky 384effe
@@ -142,7 +149,7 @@ static void add_directory_to_dirlist(const char *dirname)
Nikola Pajkovsky 384effe
     gtk_list_store_append(list_store, &iter);
Nikola Pajkovsky 384effe
     gtk_list_store_set(list_store, &iter,
Nikola Pajkovsky 384effe
                           COLUMN_SOURCE, source,
Nikola Pajkovsky 384effe
-                          COLUMN_REASON, reason,
Nikola Pajkovsky 384effe
+                          COLUMN_REASON, not_reportable_reason? :reason,
Nikola Pajkovsky 384effe
                           //OPTION: time format
Nikola Pajkovsky 384effe
                           COLUMN_LATEST_CRASH_STR, time_buf,
Nikola Pajkovsky 384effe
                           COLUMN_LATEST_CRASH, t,
Nikola Pajkovsky 384effe
@@ -150,6 +157,7 @@ static void add_directory_to_dirlist(const char *dirname)
Nikola Pajkovsky 384effe
                           COLUMN_REPORTED_TO, msg ? subm_status : NULL,
Nikola Pajkovsky 384effe
                           -1);
Nikola Pajkovsky 384effe
     /* this is safe, subm_status is either null or malloced string from get_last_line */
Nikola Pajkovsky 384effe
+    free(not_reportable_reason);
Nikola Pajkovsky 384effe
     free(subm_status);
Nikola Pajkovsky 384effe
     free(msg);
Nikola Pajkovsky 384effe
     free(reason);
Nikola Pajkovsky 384effe
@@ -243,7 +251,9 @@ static void on_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTre
Nikola Pajkovsky 384effe
             gtk_tree_model_get_value(store, &iter, COLUMN_DUMP_DIR, &d_dir);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
             const char *dirname = g_value_get_string(&d_dir);
Nikola Pajkovsky 384effe
-            report_problem_in_dir(dirname, LIBREPORT_ANALYZE | LIBREPORT_NOWAIT | LIBREPORT_GETPID);
Nikola Pajkovsky 384effe
+
Nikola Pajkovsky 384effe
+            report_problem_in_dir(dirname,
Nikola Pajkovsky 384effe
+                                  LIBREPORT_ANALYZE | LIBREPORT_NOWAIT | LIBREPORT_GETPID);
Nikola Pajkovsky 384effe
         }
Nikola Pajkovsky 384effe
     }
Nikola Pajkovsky 384effe
 }
Nikola Pajkovsky 384effe
diff --git a/src/plugins/abrt-dump-oops.c b/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 384effe
index 76c699d..58af506 100644
Nikola Pajkovsky 384effe
--- a/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 384effe
+++ b/src/plugins/abrt-dump-oops.c
Nikola Pajkovsky 384effe
@@ -480,16 +480,6 @@ static unsigned save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
     VERB1 log("Saving %u oopses as dump dirs", idx >= countdown ? countdown-1 : idx);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
-    char *tainted_str = NULL;
Nikola Pajkovsky 384effe
-    FILE *tainted_fp = fopen("/proc/sys/kernel/tainted", "r");
Nikola Pajkovsky 384effe
-    if (tainted_fp)
Nikola Pajkovsky 384effe
-    {
Nikola Pajkovsky 384effe
-        tainted_str = xmalloc_fgetline(tainted_fp);
Nikola Pajkovsky 384effe
-        fclose(tainted_fp);
Nikola Pajkovsky 384effe
-    }
Nikola Pajkovsky 384effe
-    else
Nikola Pajkovsky 384effe
-        perror_msg("Can't open '%s'", "/proc/sys/kernel/tainted");
Nikola Pajkovsky 384effe
-
Nikola Pajkovsky 384effe
     char *cmdline_str = NULL;
Nikola Pajkovsky 384effe
     FILE *cmdline_fp = fopen("/proc/cmdline", "r");
Nikola Pajkovsky 384effe
     if (cmdline_fp)
Nikola Pajkovsky 384effe
@@ -536,35 +526,44 @@ static unsigned save_oops_to_dump_dir(GList *oops_list, unsigned oops_cnt)
Nikola Pajkovsky 384effe
             if (cmdline_str)
Nikola Pajkovsky 384effe
                 dd_save_text(dd, FILENAME_CMDLINE, cmdline_str);
Nikola Pajkovsky 384effe
             dd_save_text(dd, FILENAME_BACKTRACE, second_line);
Nikola Pajkovsky 384effe
-// TODO: add "Kernel oops: " prefix, so that all oopses have recognizable FILENAME_REASON?
Nikola Pajkovsky 384effe
-// kernel oops 1st line may look quite puzzling otherwise...
Nikola Pajkovsky 384effe
-            strchrnul(second_line, '\n')[0] = '\0';
Nikola Pajkovsky 384effe
-            dd_save_text(dd, FILENAME_REASON, second_line);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
-            if (tainted_str && tainted_str[0] != '0')
Nikola Pajkovsky 384effe
+            char *tainted_short = kernel_tainted_short(second_line);
Nikola Pajkovsky 384effe
+            if (tainted_short)
Nikola Pajkovsky 384effe
             {
Nikola Pajkovsky 384effe
-                unsigned long tainted = xatoi_positive(tainted_str);
Nikola Pajkovsky 384effe
-                char *tainted_short = kernel_tainted_short(tainted);
Nikola Pajkovsky 384effe
-                GList *tainted_long = kernel_tainted_long(tainted);
Nikola Pajkovsky 384effe
-
Nikola Pajkovsky 384effe
-                struct strbuf *tnt_long = strbuf_new();
Nikola Pajkovsky 384effe
-                for (GList *li = tainted_long; li; li = li->next)
Nikola Pajkovsky 384effe
-                    strbuf_append_strf(tnt_long, "%s\n", (char*) li->data);
Nikola Pajkovsky 384effe
-
Nikola Pajkovsky 384effe
-                dd_save_text(dd, FILENAME_TAINTED, tainted_str);
Nikola Pajkovsky 384effe
+                VERB1 log("Kernel is tainted '%s'", tainted_short);
Nikola Pajkovsky 384effe
                 dd_save_text(dd, FILENAME_TAINTED_SHORT, tainted_short);
Nikola Pajkovsky 384effe
-                dd_save_text(dd, FILENAME_TAINTED_LONG, tnt_long->buf);
Nikola Pajkovsky 384effe
-                strbuf_free(tnt_long);
Nikola Pajkovsky 384effe
-                list_free_with_free(tainted_long);
Nikola Pajkovsky 384effe
+                char *reason = xasprintf("Your kernel is tainted by flags '%s'. "
Nikola Pajkovsky 384effe
+                                         "Kernel maintainers are not interesting about "
Nikola Pajkovsky 384effe
+                                         "tainted kernel, because the trace might not be showing "
Nikola Pajkovsky 384effe
+                                         "the root problem."
Nikola Pajkovsky 384effe
+                                         , tainted_short);
Nikola Pajkovsky 384effe
+                dd_save_text(dd, FILENAME_NOT_REPORTABLE, reason);
Nikola Pajkovsky 384effe
+                free(reason);
Nikola Pajkovsky 384effe
             }
Nikola Pajkovsky 384effe
+// TODO: add "Kernel oops: " prefix, so that all oopses have recognizable FILENAME_REASON?
Nikola Pajkovsky 384effe
+// kernel oops 1st line may look quite puzzling otherwise...
Nikola Pajkovsky 384effe
+            strchrnul(second_line, '\n')[0] = '\0';
Nikola Pajkovsky 384effe
+            dd_save_text(dd, FILENAME_REASON, second_line);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
+/*
Nikola Pajkovsky 384effe
+            GList *tainted_long = kernel_tainted_long(tainted);
Nikola Pajkovsky 384effe
+
Nikola Pajkovsky 384effe
+            struct strbuf *tnt_long = strbuf_new();
Nikola Pajkovsky 384effe
+            for (GList *li = tainted_long; li; li = li->next)
Nikola Pajkovsky 384effe
+                strbuf_append_strf(tnt_long, "%s\n", (char*) li->data);
Nikola Pajkovsky 384effe
+
Nikola Pajkovsky 384effe
+            dd_save_text(dd, FILENAME_TAINTED, tainted_str);
Nikola Pajkovsky 384effe
+            dd_save_text(dd, FILENAME_TAINTED_SHORT, tainted_short);
Nikola Pajkovsky 384effe
+            dd_save_text(dd, FILENAME_TAINTED_LONG, tnt_long->buf);
Nikola Pajkovsky 384effe
+            strbuf_free(tnt_long);
Nikola Pajkovsky 384effe
+            list_free_with_free(tainted_long);
Nikola Pajkovsky 384effe
+*/
Nikola Pajkovsky 384effe
             dd_close(dd);
Nikola Pajkovsky 384effe
         }
Nikola Pajkovsky 384effe
         else
Nikola Pajkovsky 384effe
             errors++;
Nikola Pajkovsky 384effe
     }
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
-    free(tainted_str);
Nikola Pajkovsky 384effe
     free(cmdline_str);
Nikola Pajkovsky 384effe
 
Nikola Pajkovsky 384effe
     return errors;
Nikola Pajkovsky 384effe
@@ -718,7 +717,15 @@ int main(int argc, char **argv)
Nikola Pajkovsky 384effe
             {
Nikola Pajkovsky 384effe
                 int i = 0;
Nikola Pajkovsky 384effe
                 while (i < oops_cnt)
Nikola Pajkovsky 384effe
-                    printf("\nVersion: %s", (char*)g_list_nth_data(oops_list, i++));
Nikola Pajkovsky 384effe
+                {
Nikola Pajkovsky 384effe
+                    char *kernel_bt = (char*)g_list_nth_data(oops_list, i++);
Nikola Pajkovsky 384effe
+                    char *tainted_short = kernel_tainted_short(kernel_bt);
Nikola Pajkovsky 384effe
+                    if (tainted_short)
Nikola Pajkovsky 384effe
+                        log("Kernel is tainted '%s'", tainted_short);
Nikola Pajkovsky 384effe
+
Nikola Pajkovsky 384effe
+                    free(tainted_short);
Nikola Pajkovsky 384effe
+                    printf("\nVersion: %s", kernel_bt);
Nikola Pajkovsky 384effe
+                }
Nikola Pajkovsky 384effe
             }
Nikola Pajkovsky 384effe
             if ((opts & OPT_d) || (opts & OPT_D))
Nikola Pajkovsky 384effe
             {
Nikola Pajkovsky 384effe
-- 
Nikola Pajkovsky 384effe
1.7.7.rc0.70.g82660
Nikola Pajkovsky 384effe