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