|
Matej Habrnal |
fa1950 |
From 506b867ad956fe28efef0b80b53a26ed0258abef Mon Sep 17 00:00:00 2001
|
|
Matej Habrnal |
fa1950 |
From: Jakub Filak <jfilak@redhat.com>
|
|
Matej Habrnal |
fa1950 |
Date: Wed, 15 Apr 2015 12:14:22 +0200
|
|
Matej Habrnal |
fa1950 |
Subject: [PATCH] ccpp: fix symlink race conditions
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Fix copy & chown race conditions
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Related: #1211835
|
|
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 | 31 +++++++++++++------------------
|
|
Matej Habrnal |
fa1950 |
1 file changed, 13 insertions(+), 18 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 7626a97..218abac 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/hooks/abrt-hook-ccpp.c
|
|
Matej Habrnal |
fa1950 |
@@ -309,21 +309,24 @@ static int create_or_die(const char *filename, int user_core_fd)
|
|
Matej Habrnal |
fa1950 |
perror_msg_and_die("Can't open '%s'", filename);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
-static void create_core_backtrace(pid_t tid, const char *executable, int signal_no, const char *dd_path)
|
|
Matej Habrnal |
fa1950 |
+static void create_core_backtrace(pid_t tid, const char *executable, int signal_no, struct dump_dir *dd)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
#ifdef ENABLE_DUMP_TIME_UNWIND
|
|
Matej Habrnal |
fa1950 |
if (g_verbose > 1)
|
|
Matej Habrnal |
fa1950 |
sr_debug_parser = true;
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
char *error_message = NULL;
|
|
Matej Habrnal |
fa1950 |
- bool success = sr_abrt_create_core_stacktrace_from_core_hook(dd_path, tid, executable,
|
|
Matej Habrnal |
fa1950 |
- signal_no, &error_message);
|
|
Matej Habrnal |
fa1950 |
+ char *core_bt = sr_abrt_get_core_stacktrace_from_core_hook(tid, executable,
|
|
Matej Habrnal |
fa1950 |
+ signal_no, &error_message);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- if (!success)
|
|
Matej Habrnal |
fa1950 |
+ if (core_bt == NULL)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
log("Failed to create core_backtrace: %s", error_message);
|
|
Matej Habrnal |
fa1950 |
free(error_message);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ dd_save_text(dd, FILENAME_CORE_BACKTRACE, core_bt);
|
|
Matej Habrnal |
fa1950 |
+ free(core_bt);
|
|
Matej Habrnal |
fa1950 |
#endif /* ENABLE_DUMP_TIME_UNWIND */
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -621,28 +624,20 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
// Disabled for now: /proc/PID/smaps tends to be BIG,
|
|
Matej Habrnal |
fa1950 |
// and not much more informative than /proc/PID/maps:
|
|
Matej Habrnal |
fa1950 |
- //copy_file(source_filename, dest_filename, 0640);
|
|
Matej Habrnal |
fa1950 |
- //chown(dest_filename, dd->dd_uid, dd->dd_gid);
|
|
Matej Habrnal |
fa1950 |
+ // dd_copy_file(dd, FILENAME_SMAPS, source_filename);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
strcpy(source_filename + source_base_ofs, "maps");
|
|
Matej Habrnal |
fa1950 |
- strcpy(dest_base, FILENAME_MAPS);
|
|
Matej Habrnal |
fa1950 |
- copy_file(source_filename, dest_filename, DEFAULT_DUMP_DIR_MODE);
|
|
Matej Habrnal |
fa1950 |
- IGNORE_RESULT(chown(dest_filename, dd->dd_uid, dd->dd_gid));
|
|
Matej Habrnal |
fa1950 |
+ dd_copy_file(dd, FILENAME_MAPS, source_filename);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
strcpy(source_filename + source_base_ofs, "limits");
|
|
Matej Habrnal |
fa1950 |
- strcpy(dest_base, FILENAME_LIMITS);
|
|
Matej Habrnal |
fa1950 |
- copy_file(source_filename, dest_filename, DEFAULT_DUMP_DIR_MODE);
|
|
Matej Habrnal |
fa1950 |
- IGNORE_RESULT(chown(dest_filename, dd->dd_uid, dd->dd_gid));
|
|
Matej Habrnal |
fa1950 |
+ dd_copy_file(dd, FILENAME_LIMITS, source_filename);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
strcpy(source_filename + source_base_ofs, "cgroup");
|
|
Matej Habrnal |
fa1950 |
- strcpy(dest_base, FILENAME_CGROUP);
|
|
Matej Habrnal |
fa1950 |
- copy_file(source_filename, dest_filename, DEFAULT_DUMP_DIR_MODE);
|
|
Matej Habrnal |
fa1950 |
- IGNORE_RESULT(chown(dest_filename, dd->dd_uid, dd->dd_gid));
|
|
Matej Habrnal |
fa1950 |
+ dd_copy_file(dd, FILENAME_CGROUP, source_filename);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
strcpy(dest_base, FILENAME_OPEN_FDS);
|
|
Matej Habrnal |
fa1950 |
strcpy(source_filename + source_base_ofs, "fd");
|
|
Matej Habrnal |
fa1950 |
- if (dump_fd_info(dest_filename, source_filename) == 0)
|
|
Matej Habrnal |
fa1950 |
- IGNORE_RESULT(chown(dest_filename, dd->dd_uid, dd->dd_gid));
|
|
Matej Habrnal |
fa1950 |
+ dump_fd_info_ext(dest_filename, source_filename, dd->dd_uid, dd->dd_gid);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
free(dest_filename);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -782,7 +777,7 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Perform crash-time unwind of the guilty thread. */
|
|
Matej Habrnal |
fa1950 |
if (tid > 0 && setting_CreateCoreBacktrace)
|
|
Matej Habrnal |
fa1950 |
- create_core_backtrace(tid, executable, signal_no, dd->dd_dirname);
|
|
Matej Habrnal |
fa1950 |
+ create_core_backtrace(tid, executable, signal_no, dd);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* We close dumpdir before we start catering for crash storm case.
|
|
Matej Habrnal |
fa1950 |
* Otherwise, delete_dump_dir's from other concurrent
|
|
Matej Habrnal |
fa1950 |
--
|
|
Matej Habrnal |
fa1950 |
2.1.0
|
|
Matej Habrnal |
fa1950 |
|