|
Matej Habrnal |
fa1950 |
From 7a10fa7c19e876ea7e5109d3d71dc9bbffc70214 Mon Sep 17 00:00:00 2001
|
|
Matej Habrnal |
fa1950 |
From: Martin Milata <mmilata@redhat.com>
|
|
Matej Habrnal |
fa1950 |
Date: Mon, 1 Dec 2014 11:47:55 +0100
|
|
Matej Habrnal |
fa1950 |
Subject: [PATCH] abrt-hook-ccpp: minor refactoring
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Related to #829.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Signed-off-by: Martin Milata <mmilata@redhat.com>
|
|
Matej Habrnal |
fa1950 |
---
|
|
Matej Habrnal |
fa1950 |
src/hooks/abrt-hook-ccpp.c | 79 ++++++++++++++++++++++++----------------------
|
|
Matej Habrnal |
fa1950 |
1 file changed, 41 insertions(+), 38 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 6f471e9..3785d89 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
@@ -140,11 +140,9 @@ static off_t copyfd_sparse(int src_fd, int dst_fd1, int dst_fd2, off_t size2)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Global data */
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
static char *user_pwd;
|
|
Matej Habrnal |
fa1950 |
-static char *proc_pid_status;
|
|
Matej Habrnal |
fa1950 |
static struct dump_dir *dd;
|
|
Matej Habrnal |
fa1950 |
-static int user_core_fd = -1;
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
/*
|
|
Matej Habrnal |
fa1950 |
* %s - signal number
|
|
Matej Habrnal |
fa1950 |
* %c - ulimit -c value
|
|
Matej Habrnal |
fa1950 |
@@ -210,7 +208,7 @@ static char* get_rootdir(pid_t pid)
|
|
Matej Habrnal |
fa1950 |
return malloc_readlink(buf);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
-static int get_fsuid(void)
|
|
Matej Habrnal |
fa1950 |
+static int get_fsuid(char *proc_pid_status)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
int real, euid, saved;
|
|
Matej Habrnal |
fa1950 |
/* if we fail to parse the uid, then make it root only readable to be safe */
|
|
Matej Habrnal |
fa1950 |
@@ -434,7 +432,7 @@ static bool dump_fd_info(const char *dest_filename, char *source_filename, int s
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Like xopen, but on error, unlocks and deletes dd and user core */
|
|
Matej Habrnal |
fa1950 |
-static int create_or_die(const char *filename)
|
|
Matej Habrnal |
fa1950 |
+static int create_or_die(const char *filename, int user_core_fd)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, DEFAULT_DUMP_DIR_MODE);
|
|
Matej Habrnal |
fa1950 |
if (fd >= 0)
|
|
Matej Habrnal |
fa1950 |
@@ -455,6 +453,31 @@ static int create_or_die(const char *filename)
|
|
Matej Habrnal |
fa1950 |
perror_msg_and_die("Can't open '%s'", filename);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+static int create_user_core(int user_core_fd, pid_t pid, off_t ulimit_c)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ if (user_core_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ off_t core_size = copyfd_size(STDIN_FILENO, user_core_fd, ulimit_c, COPYFD_SPARSE);
|
|
Matej Habrnal |
fa1950 |
+ if (fsync(user_core_fd) != 0 || close(user_core_fd) != 0 || core_size < 0)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ /* perror first, otherwise unlink may trash errno */
|
|
Matej Habrnal |
fa1950 |
+ perror_msg("Error writing '%s'", full_core_basename);
|
|
Matej Habrnal |
fa1950 |
+ xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
+ unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
+ return 1;
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+ if (ulimit_c == 0 || core_size > ulimit_c)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
+ unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
+ return 1;
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+ log_notice("Saved core dump of pid %lu to %s (%llu bytes)", (long)pid, full_core_basename, (long long)core_size);
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ return 0;
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
/* Kernel starts us with all fd's closed.
|
|
Matej Habrnal |
fa1950 |
@@ -558,10 +581,10 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
log_notice("user_pwd:'%s'", user_pwd);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
sprintf(path, "/proc/%lu/status", (long)pid);
|
|
Matej Habrnal |
fa1950 |
- proc_pid_status = xmalloc_xopen_read_close(path, /*maxsz:*/ NULL);
|
|
Matej Habrnal |
fa1950 |
+ char *proc_pid_status = xmalloc_xopen_read_close(path, /*maxsz:*/ NULL);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
uid_t fsuid = uid;
|
|
Matej Habrnal |
fa1950 |
- uid_t tmp_fsuid = get_fsuid();
|
|
Matej Habrnal |
fa1950 |
+ uid_t tmp_fsuid = get_fsuid(proc_pid_status);
|
|
Matej Habrnal |
fa1950 |
int suid_policy = dump_suid_policy();
|
|
Matej Habrnal |
fa1950 |
if (tmp_fsuid != uid)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
@@ -574,6 +597,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Open a fd to compat coredump, if requested and is possible */
|
|
Matej Habrnal |
fa1950 |
+ int user_core_fd = -1;
|
|
Matej Habrnal |
fa1950 |
if (setting_MakeCompatCore && ulimit_c != 0)
|
|
Matej Habrnal |
fa1950 |
/* note: checks "user_pwd == NULL" inside; updates core_basename */
|
|
Matej Habrnal |
fa1950 |
user_core_fd = open_user_core(uid, fsuid, pid, &argv[1]);
|
|
Matej Habrnal |
fa1950 |
@@ -582,7 +606,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
/* readlink on /proc/$PID/exe failed, don't create abrt dump dir */
|
|
Matej Habrnal |
fa1950 |
error_msg("Can't read /proc/%lu/exe link", (long)pid);
|
|
Matej Habrnal |
fa1950 |
- goto create_user_core;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
const char *signame = NULL;
|
|
Matej Habrnal |
fa1950 |
@@ -601,7 +625,7 @@ int main(int argc, char** argv)
|
|
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: goto create_user_core; // not a signal we care about
|
|
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 |
|
|
Matej Habrnal |
fa1950 |
if (!daemon_is_ok())
|
|
Matej Habrnal |
fa1950 |
@@ -611,14 +635,14 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
"/proc/sys/kernel/core_pattern contains a stale value, "
|
|
Matej Habrnal |
fa1950 |
"consider resetting it to 'core'"
|
|
Matej Habrnal |
fa1950 |
);
|
|
Matej Habrnal |
fa1950 |
- goto create_user_core;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
if (g_settings_nMaxCrashReportsSize > 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
/* If free space is less than 1/4 of MaxCrashReportsSize... */
|
|
Matej Habrnal |
fa1950 |
if (low_free_space(g_settings_nMaxCrashReportsSize, g_settings_dump_location))
|
|
Matej Habrnal |
fa1950 |
- goto create_user_core;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Check /var/tmp/abrt/last-ccpp marker, do not dump repeated crashes
|
|
Matej Habrnal |
fa1950 |
@@ -628,7 +652,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
if (check_recent_crash_file(path, executable))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
/* It is a repeating crash */
|
|
Matej Habrnal |
fa1950 |
- goto create_user_core;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
const char *last_slash = strrchr(executable, '/');
|
|
Matej Habrnal |
fa1950 |
@@ -657,7 +681,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
g_settings_dump_location, iso_date_string(NULL), (long)pid);
|
|
Matej Habrnal |
fa1950 |
if (path_len >= (sizeof(path) - sizeof("/"FILENAME_COREDUMP)))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- goto create_user_core;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* use fsuid instead of uid, so we don't expose any sensitive
|
|
Matej Habrnal |
fa1950 |
@@ -741,7 +765,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
if (src_fd_binary > 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
strcpy(path + path_len, "/"FILENAME_BINARY);
|
|
Matej Habrnal |
fa1950 |
- int dst_fd = create_or_die(path);
|
|
Matej Habrnal |
fa1950 |
+ int dst_fd = create_or_die(path, user_core_fd);
|
|
Matej Habrnal |
fa1950 |
off_t sz = copyfd_eof(src_fd_binary, dst_fd, COPYFD_SPARSE);
|
|
Matej Habrnal |
fa1950 |
if (fsync(dst_fd) != 0 || close(dst_fd) != 0 || sz < 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
@@ -752,7 +776,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
strcpy(path + path_len, "/"FILENAME_COREDUMP);
|
|
Matej Habrnal |
fa1950 |
- int abrt_core_fd = create_or_die(path);
|
|
Matej Habrnal |
fa1950 |
+ int abrt_core_fd = create_or_die(path, user_core_fd);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* We write both coredumps at once.
|
|
Matej Habrnal |
fa1950 |
* We can't write user coredump first, since it might be truncated
|
|
Matej Habrnal |
fa1950 |
@@ -812,7 +836,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
if (src_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
strcpy(path + path_len, "/hs_err.log");
|
|
Matej Habrnal |
fa1950 |
- int dst_fd = create_or_die(path);
|
|
Matej Habrnal |
fa1950 |
+ int dst_fd = create_or_die(path, user_core_fd);
|
|
Matej Habrnal |
fa1950 |
off_t sz = copyfd_eof(src_fd, dst_fd, COPYFD_SPARSE);
|
|
Matej Habrnal |
fa1950 |
if (close(dst_fd) != 0 || sz < 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
@@ -856,26 +880,5 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* We didn't create abrt dump, but may need to create compat coredump */
|
|
Matej Habrnal |
fa1950 |
- create_user_core:
|
|
Matej Habrnal |
fa1950 |
- if (user_core_fd >= 0)
|
|
Matej Habrnal |
fa1950 |
- {
|
|
Matej Habrnal |
fa1950 |
- off_t core_size = copyfd_size(STDIN_FILENO, user_core_fd, ulimit_c, COPYFD_SPARSE);
|
|
Matej Habrnal |
fa1950 |
- if (fsync(user_core_fd) != 0 || close(user_core_fd) != 0 || core_size < 0)
|
|
Matej Habrnal |
fa1950 |
- {
|
|
Matej Habrnal |
fa1950 |
- /* perror first, otherwise unlink may trash errno */
|
|
Matej Habrnal |
fa1950 |
- perror_msg("Error writing '%s'", full_core_basename);
|
|
Matej Habrnal |
fa1950 |
- xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
- unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
- return 1;
|
|
Matej Habrnal |
fa1950 |
- }
|
|
Matej Habrnal |
fa1950 |
- if (ulimit_c == 0 || core_size > ulimit_c)
|
|
Matej Habrnal |
fa1950 |
- {
|
|
Matej Habrnal |
fa1950 |
- xchdir(user_pwd);
|
|
Matej Habrnal |
fa1950 |
- unlink(core_basename);
|
|
Matej Habrnal |
fa1950 |
- return 1;
|
|
Matej Habrnal |
fa1950 |
- }
|
|
Matej Habrnal |
fa1950 |
- log_notice("Saved core dump of pid %lu to %s (%llu bytes)", (long)pid, full_core_basename, (long long)core_size);
|
|
Matej Habrnal |
fa1950 |
- }
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- return 0;
|
|
Matej Habrnal |
fa1950 |
+ return create_user_core(user_core_fd, pid, ulimit_c);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
--
|
|
Matej Habrnal |
fa1950 |
2.1.0
|
|
Matej Habrnal |
fa1950 |
|