Adam Williamson bcfb1b
From 94dc5d2783133cea27b1ae804d5b8a2da06808c5 Mon Sep 17 00:00:00 2001
Adam Williamson bcfb1b
From: Matej Habrnal <mhabrnal@redhat.com>
Adam Williamson bcfb1b
Date: Wed, 6 Jun 2018 14:04:09 +0200
Adam Williamson bcfb1b
Subject: [PATCH] ccpp: add %h and %e parameter into abrt-hook-ccpp
Adam Williamson bcfb1b
Adam Williamson bcfb1b
Without this commit core_pattern's parameter %h and %e was not
Adam Williamson bcfb1b
translated at all.
Adam Williamson bcfb1b
Adam Williamson bcfb1b
If there is a white space in executable filename, %e replaced only by
Adam Williamson bcfb1b
the first part of executable name (till the space). Hence we decided
Adam Williamson bcfb1b
to get executable name from /proc/PID/exe symlink exist.
Adam Williamson bcfb1b
Adam Williamson bcfb1b
Example:
Adam Williamson bcfb1b
If 'core_pattern = core.%h.%p.%t.%e' the result was
Adam Williamson bcfb1b
core.%h.26284.1469805542.sleep not
Adam Williamson bcfb1b
core.myshostmane.26284.1469805542.sleep with spaces
Adam Williamson bcfb1b
Adam Williamson bcfb1b
Related to #1587891
Adam Williamson bcfb1b
Adam Williamson bcfb1b
Signed-off-by: Matej Habrnal <mhabrnal@redhat.com>
Adam Williamson bcfb1b
---
Adam Williamson bcfb1b
 src/hooks/abrt-hook-ccpp.c          | 36 +++++++++++++++++++----------
Adam Williamson bcfb1b
 src/hooks/abrt-install-ccpp-hook.in |  2 +-
Adam Williamson bcfb1b
 2 files changed, 25 insertions(+), 13 deletions(-)
Adam Williamson bcfb1b
Adam Williamson bcfb1b
diff --git a/src/hooks/abrt-hook-ccpp.c b/src/hooks/abrt-hook-ccpp.c
Adam Williamson bcfb1b
index 1c4e45e5..40117fc8 100644
Adam Williamson bcfb1b
--- a/src/hooks/abrt-hook-ccpp.c
Adam Williamson bcfb1b
+++ b/src/hooks/abrt-hook-ccpp.c
Adam Williamson bcfb1b
@@ -65,13 +65,13 @@ static struct dump_dir *dd;
Adam Williamson bcfb1b
  * %t - UNIX time of dump
Adam Williamson bcfb1b
  * %P - global pid
Adam Williamson bcfb1b
  * %I - crash thread tid
Adam Williamson bcfb1b
- * %e - executable filename (can contain white spaces)
Adam Williamson bcfb1b
+ * %h - hostname
Adam Williamson bcfb1b
+ * %e - executable filename (can contain white spaces, must be placed at the end)
Adam Williamson bcfb1b
  * %% - output one "%"
Adam Williamson bcfb1b
  */
Adam Williamson bcfb1b
 /* Hook must be installed with exactly the same sequence of %c specifiers.
Adam Williamson bcfb1b
- * Last one, %h, may be omitted (we can find it out).
Adam Williamson bcfb1b
  */
Adam Williamson bcfb1b
-static const char percent_specifiers[] = "%scpugtePi";
Adam Williamson bcfb1b
+static const char percent_specifiers[] = "%scpugtPIhe";
Adam Williamson bcfb1b
 static char *core_basename = (char*) "core";
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
 static DIR *open_cwd(pid_t pid)
Adam Williamson bcfb1b
@@ -146,7 +146,8 @@ static int setfscreatecon_raw(security_context_t context)
Adam Williamson bcfb1b
 }
Adam Williamson bcfb1b
 #endif
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
-static int open_user_core(uid_t uid, uid_t fsuid, gid_t fsgid, pid_t pid, char **percent_values)
Adam Williamson bcfb1b
+static int open_user_core(uid_t uid, uid_t fsuid, gid_t fsgid, pid_t pid,
Adam Williamson bcfb1b
+                          char **percent_values, const char *executable_filename)
Adam Williamson bcfb1b
 {
Adam Williamson bcfb1b
     proc_cwd = open_cwd(pid);
Adam Williamson bcfb1b
     if (proc_cwd == NULL)
Adam Williamson bcfb1b
@@ -196,7 +197,13 @@ static int open_user_core(uid_t uid, uid_t fsuid, gid_t fsgid, pid_t pid, char *
Adam Williamson bcfb1b
             {
Adam Williamson bcfb1b
                 const char *val = "%";
Adam Williamson bcfb1b
                 if (specifier_num > 0) /* not %% */
Adam Williamson bcfb1b
+                {
Adam Williamson bcfb1b
                     val = percent_values[specifier_num - 1];
Adam Williamson bcfb1b
+                    /* if %e (executable filename), use executable from
Adam Williamson bcfb1b
+                     * /proc/PID/exe symlink if exists */
Adam Williamson bcfb1b
+                    if (percent_specifiers[specifier_num] == 'e' && executable_filename)
Adam Williamson bcfb1b
+                        val = executable_filename;
Adam Williamson bcfb1b
+                }
Adam Williamson bcfb1b
                 //log_warning("c:'%c'", c);
Adam Williamson bcfb1b
                 //log_warning("val:'%s'", val);
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
@@ -917,9 +924,9 @@ int main(int argc, char** argv)
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
     if (argc < 8)
Adam Williamson bcfb1b
     {
Adam Williamson bcfb1b
-        /* percent specifier:         %s   %c              %p  %u  %g  %t   %P         %T        */
Adam Williamson bcfb1b
-        /* argv:                  [0] [1]  [2]             [3] [4] [5] [6]  [7]        [8]       */
Adam Williamson bcfb1b
-        error_msg_and_die("Usage: %s SIGNO CORE_SIZE_LIMIT PID UID GID TIME GLOBAL_PID GLOBAL_TID", argv[0]);
Adam Williamson bcfb1b
+        /* percent specifier:         %s   %c              %p  %u  %g  %t   %P         %I         %h       %e   */
Adam Williamson bcfb1b
+        /* argv:                  [0] [1]  [2]             [3] [4] [5] [6]  [7]        [8]        [9]      [10] */
Adam Williamson bcfb1b
+        error_msg_and_die("Usage: %s SIGNO CORE_SIZE_LIMIT PID UID GID TIME GLOBAL_PID GLOBAL_TID HOSTNAME BINARY_NAME", argv[0]);
Adam Williamson bcfb1b
     }
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
     /* Not needed on 2.6.30.
Adam Williamson bcfb1b
@@ -1016,13 +1023,21 @@ int main(int argc, char** argv)
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
     snprintf(path, sizeof(path), "%s/last-ccpp", g_settings_dump_location);
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
+    char *executable = get_executable_at(pid_proc_fd);
Adam Williamson bcfb1b
+    const char *last_slash = NULL;
Adam Williamson bcfb1b
+    if (executable)
Adam Williamson bcfb1b
+    {
Adam Williamson bcfb1b
+        last_slash = strrchr(executable, '/');
Adam Williamson bcfb1b
+        /* if the last_slash was found, skip it */
Adam Williamson bcfb1b
+        if (last_slash) ++last_slash;
Adam Williamson bcfb1b
+    }
Adam Williamson bcfb1b
+
Adam Williamson bcfb1b
     /* Open a fd to compat coredump, if requested and is possible */
Adam Williamson bcfb1b
     int user_core_fd = -1;
Adam Williamson bcfb1b
     if (setting_MakeCompatCore && ulimit_c != 0)
Adam Williamson bcfb1b
         /* note: checks "user_pwd == NULL" inside; updates core_basename */
Adam Williamson bcfb1b
-        user_core_fd = open_user_core(uid, fsuid, fsgid, pid, &argv[1]);
Adam Williamson bcfb1b
+        user_core_fd = open_user_core(uid, fsuid, fsgid, pid, &argv[1], (const char *)last_slash);
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
-    char *executable = get_executable_at(pid_proc_fd);
Adam Williamson bcfb1b
     if (executable == NULL)
Adam Williamson bcfb1b
     {
Adam Williamson bcfb1b
         /* readlink on /proc/$PID/exe failed, don't create abrt dump dir */
Adam Williamson bcfb1b
@@ -1031,9 +1046,6 @@ int main(int argc, char** argv)
Adam Williamson bcfb1b
         return create_user_core(user_core_fd, pid, ulimit_c);
Adam Williamson bcfb1b
     }
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
-    const char *last_slash = strrchr(executable, '/');
Adam Williamson bcfb1b
-    /* if the last_slash was found, skip it */
Adam Williamson bcfb1b
-    if (last_slash) ++last_slash;
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
     /* ignoring crashes */
Adam Williamson bcfb1b
     if (executable && is_path_ignored(setting_ignored_paths, executable))
Adam Williamson bcfb1b
diff --git a/src/hooks/abrt-install-ccpp-hook.in b/src/hooks/abrt-install-ccpp-hook.in
Adam Williamson bcfb1b
index 660c2091..f8c0c610 100755
Adam Williamson bcfb1b
--- a/src/hooks/abrt-install-ccpp-hook.in
Adam Williamson bcfb1b
+++ b/src/hooks/abrt-install-ccpp-hook.in
Adam Williamson bcfb1b
@@ -11,7 +11,7 @@ SAVED_PATTERN_DIR="@VAR_RUN@/abrt"
Adam Williamson bcfb1b
 SAVED_PATTERN_FILE="@VAR_RUN@/abrt/saved_core_pattern"
Adam Williamson bcfb1b
 HOOK_BIN="@libexecdir@/abrt-hook-ccpp"
Adam Williamson bcfb1b
 # Must match percent_specifiers[] order in abrt-hook-ccpp.c:
Adam Williamson bcfb1b
-PATTERN="|$HOOK_BIN %s %c %p %u %g %t %P %I"
Adam Williamson bcfb1b
+PATTERN="|$HOOK_BIN %s %c %p %u %g %t %P %I %h %e"
Adam Williamson bcfb1b
 
Adam Williamson bcfb1b
 # core_pipe_limit specifies how many dump_helpers can run at the same time
Adam Williamson bcfb1b
 # 0 - means unlimited, but it's not guaranteed that /proc/<pid> of crashing
Adam Williamson bcfb1b
-- 
Adam Williamson bcfb1b
2.19.0
Adam Williamson bcfb1b