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