Matej Habrnal fa1950
From 8e8d2edd5c5eac60b33cb36cc6012d076ddb9b13 Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Thu, 11 Dec 2014 16:17:21 +0100
Matej Habrnal fa1950
Subject: [PATCH] ccpp-hook: move utility functions to hooklib
Matej Habrnal fa1950
Matej Habrnal fa1950
Related to #548
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 src/hooks/abrt-hook-ccpp.c | 49 ++----------------------------------------
Matej Habrnal fa1950
 src/include/hooklib.h      |  6 ++++++
Matej Habrnal fa1950
 src/lib/hooklib.c          | 53 ++++++++++++++++++++++++++++++++++++++++++++++
Matej Habrnal fa1950
 3 files changed, 61 insertions(+), 47 deletions(-)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
index 7fd9520..37a9a74 100644
Matej Habrnal fa1950
--- a/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
+++ b/src/hooks/abrt-hook-ccpp.c
Matej Habrnal fa1950
@@ -26,9 +26,6 @@
Matej Habrnal fa1950
 #include <satyr/utils.h>
Matej Habrnal fa1950
 #endif /* ENABLE_DUMP_TIME_UNWIND */
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-#define  DUMP_SUID_UNSAFE 1
Matej Habrnal fa1950
-#define  DUMP_SUID_SAFE 2
Matej Habrnal fa1950
-
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 /* I want to use -Werror, but gcc-4.4 throws a curveball:
Matej Habrnal fa1950
  * "warning: ignoring return value of 'ftruncate', declared with attribute warn_unused_result"
Matej Habrnal fa1950
@@ -157,33 +154,6 @@ static char *core_basename = (char*) "core";
Matej Habrnal fa1950
  */
Matej Habrnal fa1950
 static char *full_core_basename;
Matej Habrnal fa1950
 
Matej Habrnal fa1950
-static int dump_suid_policy()
Matej Habrnal fa1950
-{
Matej Habrnal fa1950
-    /*
Matej Habrnal fa1950
-     - values are:
Matej Habrnal fa1950
-       0 - don't dump suided programs - in this case the hook is not called by kernel
Matej Habrnal fa1950
-       1 - create coredump readable by fs_uid
Matej Habrnal fa1950
-       2 - create coredump readable by root only
Matej Habrnal fa1950
-    */
Matej Habrnal fa1950
-    int c;
Matej Habrnal fa1950
-    int suid_dump_policy = 0;
Matej Habrnal fa1950
-    const char *filename = "/proc/sys/fs/suid_dumpable";
Matej Habrnal fa1950
-    FILE *f  = fopen(filename, "r");
Matej Habrnal fa1950
-    if (!f)
Matej Habrnal fa1950
-    {
Matej Habrnal fa1950
-        log("Can't open %s", filename);
Matej Habrnal fa1950
-        return suid_dump_policy;
Matej Habrnal fa1950
-    }
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    c = fgetc(f);
Matej Habrnal fa1950
-    fclose(f);
Matej Habrnal fa1950
-    if (c != EOF)
Matej Habrnal fa1950
-        suid_dump_policy = c - '0';
Matej Habrnal fa1950
-
Matej Habrnal fa1950
-    //log("suid dump policy is: %i", suid_dump_policy);
Matej Habrnal fa1950
-    return suid_dump_policy;
Matej Habrnal fa1950
-}
Matej Habrnal fa1950
-
Matej Habrnal fa1950
 static int open_user_core(uid_t uid, uid_t fsuid, pid_t pid, char **percent_values)
Matej Habrnal fa1950
 {
Matej Habrnal fa1950
     errno = 0;
Matej Habrnal fa1950
@@ -564,23 +534,8 @@ int main(int argc, char** argv)
Matej Habrnal fa1950
     }
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     const char *signame = NULL;
Matej Habrnal fa1950
-    switch (signal_no)
Matej Habrnal fa1950
-    {
Matej Habrnal fa1950
-        case SIGILL : signame = "ILL" ; break;
Matej Habrnal fa1950
-        case SIGFPE : signame = "FPE" ; break;
Matej Habrnal fa1950
-        case SIGSEGV: signame = "SEGV"; break;
Matej Habrnal fa1950
-        case SIGBUS : signame = "BUS" ; break; //Bus error (bad memory access)
Matej Habrnal fa1950
-        case SIGABRT: signame = "ABRT"; break; //usually when abort() was called
Matej Habrnal fa1950
-    // We have real-world reports from users who see buggy programs
Matej Habrnal fa1950
-    // dying with SIGTRAP, uncommented it too:
Matej Habrnal fa1950
-        case SIGTRAP: signame = "TRAP"; break; //Trace/breakpoint trap
Matej Habrnal fa1950
-    // These usually aren't caused by bugs:
Matej Habrnal fa1950
-      //case SIGQUIT: signame = "QUIT"; break; //Quit from keyboard
Matej Habrnal fa1950
-      //case SIGSYS : signame = "SYS" ; break; //Bad argument to routine (SVr4)
Matej Habrnal fa1950
-      //case SIGXCPU: signame = "XCPU"; break; //CPU time limit exceeded (4.2BSD)
Matej Habrnal fa1950
-      //case SIGXFSZ: signame = "XFSZ"; break; //File size limit exceeded (4.2BSD)
Matej Habrnal fa1950
-        default: return create_user_core(user_core_fd, pid, ulimit_c); // not a signal we care about
Matej Habrnal fa1950
-    }
Matej Habrnal fa1950
+    if (!signal_is_fatal(signal_no, &signame))
Matej Habrnal fa1950
+        return create_user_core(user_core_fd, pid, ulimit_c); // not a signal we care about
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     if (!daemon_is_ok())
Matej Habrnal fa1950
     {
Matej Habrnal fa1950
diff --git a/src/include/hooklib.h b/src/include/hooklib.h
Matej Habrnal fa1950
index 4edd4ea..1ede5e4 100644
Matej Habrnal fa1950
--- a/src/include/hooklib.h
Matej Habrnal fa1950
+++ b/src/include/hooklib.h
Matej Habrnal fa1950
@@ -29,3 +29,9 @@
Matej Habrnal fa1950
  stored data, but it's not guaranteed)
Matej Habrnal fa1950
  */
Matej Habrnal fa1950
 char *problem_data_save(problem_data_t *pd);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+#define  DUMP_SUID_UNSAFE 1
Matej Habrnal fa1950
+#define  DUMP_SUID_SAFE 2
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+int dump_suid_policy();
Matej Habrnal fa1950
+int signal_is_fatal(int signal_no, const char **name);
Matej Habrnal fa1950
diff --git a/src/lib/hooklib.c b/src/lib/hooklib.c
Matej Habrnal fa1950
index 1d45cdd..2be4e80 100644
Matej Habrnal fa1950
--- a/src/lib/hooklib.c
Matej Habrnal fa1950
+++ b/src/lib/hooklib.c
Matej Habrnal fa1950
@@ -422,3 +422,56 @@ char* problem_data_save(problem_data_t *pd)
Matej Habrnal fa1950
     log_info("problem id: '%s'", problem_id);
Matej Habrnal fa1950
     return problem_id;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+int dump_suid_policy()
Matej Habrnal fa1950
+{
Matej Habrnal fa1950
+    /*
Matej Habrnal fa1950
+     - values are:
Matej Habrnal fa1950
+       0 - don't dump suided programs - in this case the hook is not called by kernel
Matej Habrnal fa1950
+       1 - create coredump readable by fs_uid
Matej Habrnal fa1950
+       2 - create coredump readable by root only
Matej Habrnal fa1950
+    */
Matej Habrnal fa1950
+    int c;
Matej Habrnal fa1950
+    int suid_dump_policy = 0;
Matej Habrnal fa1950
+    const char *filename = "/proc/sys/fs/suid_dumpable";
Matej Habrnal fa1950
+    FILE *f  = fopen(filename, "r");
Matej Habrnal fa1950
+    if (!f)
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        log("Can't open %s", filename);
Matej Habrnal fa1950
+        return suid_dump_policy;
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    c = fgetc(f);
Matej Habrnal fa1950
+    fclose(f);
Matej Habrnal fa1950
+    if (c != EOF)
Matej Habrnal fa1950
+        suid_dump_policy = c - '0';
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    //log("suid dump policy is: %i", suid_dump_policy);
Matej Habrnal fa1950
+    return suid_dump_policy;
Matej Habrnal fa1950
+}
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+int signal_is_fatal(int signal_no, const char **name)
Matej Habrnal fa1950
+{
Matej Habrnal fa1950
+    const char *signame = NULL;
Matej Habrnal fa1950
+    switch (signal_no)
Matej Habrnal fa1950
+    {
Matej Habrnal fa1950
+        case SIGILL : signame = "ILL" ; break;
Matej Habrnal fa1950
+        case SIGFPE : signame = "FPE" ; break;
Matej Habrnal fa1950
+        case SIGSEGV: signame = "SEGV"; break;
Matej Habrnal fa1950
+        case SIGBUS : signame = "BUS" ; break; //Bus error (bad memory access)
Matej Habrnal fa1950
+        case SIGABRT: signame = "ABRT"; break; //usually when abort() was called
Matej Habrnal fa1950
+    // We have real-world reports from users who see buggy programs
Matej Habrnal fa1950
+    // dying with SIGTRAP, uncommented it too:
Matej Habrnal fa1950
+        case SIGTRAP: signame = "TRAP"; break; //Trace/breakpoint trap
Matej Habrnal fa1950
+    // These usually aren't caused by bugs:
Matej Habrnal fa1950
+      //case SIGQUIT: signame = "QUIT"; break; //Quit from keyboard
Matej Habrnal fa1950
+      //case SIGSYS : signame = "SYS" ; break; //Bad argument to routine (SVr4)
Matej Habrnal fa1950
+      //case SIGXCPU: signame = "XCPU"; break; //CPU time limit exceeded (4.2BSD)
Matej Habrnal fa1950
+      //case SIGXFSZ: signame = "XFSZ"; break; //File size limit exceeded (4.2BSD)
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    if (name != NULL)
Matej Habrnal fa1950
+        *name = signame;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    return signame != NULL;
Matej Habrnal fa1950
+}
Matej Habrnal fa1950
-- 
Matej Habrnal fa1950
2.1.0
Matej Habrnal fa1950