Fail early if can not run minicoredumper properly 53/187353/3
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 22 Aug 2018 07:02:41 +0000 (09:02 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Wed, 22 Aug 2018 10:55:01 +0000 (12:55 +0200)
Minicoredumper is essential for gathering report, so
it does not make much sense to continue when we can't
even pass right parameters (prstatus).

Change-Id: Id7560452110871190f243f7ff61f4e849351a8af

src/crash-manager/crash-manager.c

index c42f261..87b6756 100644 (file)
@@ -775,16 +775,18 @@ static void save_so_info()
        get_and_save_so_info(maps_path, so_info_path);
 }
 
-static void execute_minicoredump(int argc, char *argv[])
+static int execute_minicoredump(int argc, char *argv[])
 {
        char *coredump_name = NULL;
        char *prstatus_fd_str = NULL;
+       int ret = 0;
 
-       if (asprintf(&coredump_name, "%s.coredump", crash_info.name) == -1)
-               coredump_name = strdup("core");
-
-       if (asprintf(&prstatus_fd_str, "%d", crash_info.prstatus_fd) == -1)
-               prstatus_fd_str = strdup("-1");
+       if (asprintf(&coredump_name, "%s.coredump", crash_info.name) == -1
+           || asprintf(&prstatus_fd_str, "%d", crash_info.prstatus_fd) == -1) {
+               _E("Unable to allocate memory");
+               ret = -1;
+               goto out;
+       }
 
        /* Execute minicoredumper */
        char *args[] = {
@@ -829,8 +831,11 @@ static void execute_minicoredump(int argc, char *argv[])
                   ret == 0 ? "success" : strerror(errno_unlink));
        }
 
+out:
        free(coredump_name);
        free(prstatus_fd_str);
+
+       return ret;
 }
 
 static void execute_crash_stack(int argc, char *argv[])
@@ -865,19 +870,24 @@ static void execute_crash_stack(int argc, char *argv[])
        system_command(command);
 }
 
-static void execute_crash_modules(int argc, char *argv[])
+static int execute_crash_modules(int argc, char *argv[])
 {
        _D("Execute crash module: ");
 
-       execute_minicoredump(argc, argv);
+       if (execute_minicoredump(argc, argv) < 0) {
+               _E("Failed to run minicoredumper - can not continue");
+               return -1;
+       }
 
 #ifdef SYS_ASSERT
        /* Use process_vm_readv() version as fallback if sys-assert
         * failed to generate report */
        if (crash_info.have_sysassert_report)
-               return;
+               return -1;
 #endif
        execute_crash_stack(argc, argv);
+
+       return 0;
 }
 
 static int lock_dumpdir(void)
@@ -1259,7 +1269,10 @@ int main(int argc, char *argv[])
                copy_maps();
        }
        /* Exec crash modules */
-       execute_crash_modules(argc, argv);
+       if (execute_crash_modules(argc, argv) < 0) {
+               res = EXIT_FAILURE;
+               goto exit;
+       }
 
        if (report_type >= REP_TYPE_FULL) {
                /* Save shared objects info (file names, bulid IDs, rpm package names) */