summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>2018-08-31 14:04:49 +0200
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>2018-09-05 09:32:11 +0200
commit441ff63bdb63c421183c929bd783ba1084ff719d (patch)
tree84f27576824ef50325fe4bd8c1ee7e13b6e3e8fa
parent403dcf7bfaf147d74c62c23a6a0726aee65c44fe (diff)
downloadcrash-worker-441ff63bdb63c421183c929bd783ba1084ff719d.tar.gz
crash-worker-441ff63bdb63c421183c929bd783ba1084ff719d.tar.bz2
crash-worker-441ff63bdb63c421183c929bd783ba1084ff719d.zip
Add timeout to run the crash-stack
In case the crash-stack hangs, the crash-manager will still be able to create a raport. Change-Id: I62b3022dc1aec6507821473619c73cf90337643f
-rw-r--r--src/crash-manager/crash-manager.c62
1 files changed, 44 insertions, 18 deletions
diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c
index 3aa16d6..4c760bf 100644
--- a/src/crash-manager/crash-manager.c
+++ b/src/crash-manager/crash-manager.c
@@ -74,6 +74,7 @@
#define WAIT_FOR_OPT_TIMEOUT_SEC 60
#define MINICOREDUMPER_TIMEOUT 12*60
+#define CRASH_STACK_TIMEOUT 12*60
#define TEMP_MAPS_FILENAME "maps.temp"
enum {
@@ -741,10 +742,12 @@ static void save_so_info(const struct crash_info *cinfo)
get_and_save_so_info(maps_path, so_info_path);
}
+// These macros are used in execute_minicoredump() and execute_crash_stack()
+#define SNPRINTF_OR_EXIT_W(name, format, member) if (snprintf(name##_str, sizeof(name##_str), format, cinfo->member) < 0) goto out;
+#define SNPRINTF_OR_EXIT(name, format) SNPRINTF_OR_EXIT_W(name, format, name##_info)
+
static int execute_minicoredump(struct crash_info *cinfo)
{
-#define SNPRINTF_OR_EXIT(name, format) if (snprintf(name##_str, sizeof(name##_str), format, cinfo->name##_info) < 0) goto out;
-
char *coredump_name = NULL;
char *prstatus_fd_str = NULL;
int ret = -1;
@@ -818,33 +821,56 @@ out:
free(prstatus_fd_str);
return ret;
-#undef SNPRINTF_OR_EXIT
}
-static void execute_crash_stack(const struct crash_info *cinfo)
+static int execute_crash_stack(const struct crash_info *cinfo)
{
- int ret;
- char command[PATH_MAX];
+ int ret = -1;
+ int fd = -1;
+
+ char pid_str[11], tid_str[11], sig_str[11], prstatus_fd_str[11];
+
+ SNPRINTF_OR_EXIT(pid, "%d")
+ SNPRINTF_OR_EXIT(tid, "%d")
+ SNPRINTF_OR_EXIT(sig, "%d")
+ SNPRINTF_OR_EXIT_W(prstatus_fd, "%d", prstatus_fd)
/* Execute crash-stack */
- ret = snprintf(command, sizeof(command),
- "%s --pid %d --tid %d --sig %d --prstatus_fd %d > %s",
+ char *args[] = {
CRASH_STACK_PATH,
- cinfo->pid_info,
- cinfo->tid_info,
- cinfo->sig_info,
- cinfo->prstatus_fd,
- cinfo->info_path);
+ "--pid",
+ pid_str,
+ "--tid",
+ tid_str,
+ "--sig",
+ sig_str,
+ "--prstatus_fd",
+ prstatus_fd_str,
+ NULL
+ };
- _D(" %s", command);
- if (ret < 0) {
- _E("Failed to snprintf for crash-stack command");
- return;
+ _D(" %s %s %s %s %s %s %s %s %s",
+ args[0], args[1], args[2], args[3],
+ args[4], args[5], args[6], args[7], args[8]);
+
+ fd = open(cinfo->info_path, O_WRONLY | O_CREAT, 0600);
+ if (fd < 0) {
+ _E("open %s error: %m", cinfo->info_path);
+ goto out;
}
- system_command(command);
+ ret = run_command_write_fd_timeout(CRASH_STACK_PATH, args, NULL, fd, NULL, 0, CRASH_STACK_TIMEOUT);
+
+out:
+ if (fd >= 0)
+ close(fd);
+
+ return ret;
}
+#undef SNPRINTF_OR_EXIT
+#undef SNPRINTF_OR_EXIT_W
+
static int execute_crash_modules(struct crash_info *cinfo)
{
_D("Execute crash module: ");