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