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

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