From 3b4b8a8872ef212a6bbe5ef4ac1444df880fa39f Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Mon, 24 Apr 2017 17:34:18 +0200 Subject: [PATCH 01/16] Removing dependency of tizen-debug-on/off service from sys-assert Tizen-debug-on/off service should control enabling/disabling coredump generation. When Tizen-debug-off service is executed, only callstack should be generated. Thus, although disabling sys-assert, the services should be remained. TODO : For disabling sys-assert, the services should be changed properly. Change-Id: I617356cd31b51dbe4f103cb3118fefe454e717db --- CMakeLists.txt | 1 + data/CMakeLists.txt | 7 +++++++ {src/sys-assert => data}/tizen-debug-off.service | 0 {src/sys-assert => data}/tizen-debug-on.service | 0 src/sys-assert/CMakeLists.txt | 8 -------- 5 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 data/CMakeLists.txt rename {src/sys-assert => data}/tizen-debug-off.service (100%) rename {src/sys-assert => data}/tizen-debug-on.service (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3ca59d..6982d26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,5 +17,6 @@ ENDIF() ADD_SUBDIRECTORY(src/dump_systemstate) ADD_SUBDIRECTORY(src/log_dump) +ADD_SUBDIRECTORY(data) ADD_SUBDIRECTORY(tests) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..91a31e5 --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1,7 @@ +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen-debug-on.service DESTINATION /usr/lib/systemd/system + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen-debug-off.service DESTINATION /usr/lib/systemd/system + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/src/sys-assert/tizen-debug-off.service b/data/tizen-debug-off.service similarity index 100% rename from src/sys-assert/tizen-debug-off.service rename to data/tizen-debug-off.service diff --git a/src/sys-assert/tizen-debug-on.service b/data/tizen-debug-on.service similarity index 100% rename from src/sys-assert/tizen-debug-on.service rename to data/tizen-debug-on.service diff --git a/src/sys-assert/CMakeLists.txt b/src/sys-assert/CMakeLists.txt index e6c7ca0..99d3383 100644 --- a/src/sys-assert/CMakeLists.txt +++ b/src/sys-assert/CMakeLists.txt @@ -62,11 +62,3 @@ INSTALL(TARGETS ${LIBNAME} LIBRARY DESTINATION ${LIB_INSTALL_DIR}) CONFIGURE_FILE(sys-assert.conf.in sys-assert.conf) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/sys-assert.conf DESTINATION ${TMP_FILES_DIR}) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen-debug-on.service DESTINATION /usr/lib/systemd/system - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE - GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen-debug-off.service DESTINATION /usr/lib/systemd/system - PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE - GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) \ No newline at end of file -- 2.7.4 From b9c19a3289da23bdae71252d0842cf54f9d5ff8c Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Fri, 5 May 2017 15:03:20 +0200 Subject: [PATCH 02/16] crash-worker: Generate core only if /opt/etc/.debugmode file is present Additionally, this patch moves actual path definition to one place. Change-Id: I984ac2c67d8a22ed749f2b1945a1cef237b88ace --- data/CMakeLists.txt | 3 +++ data/{tizen-debug-off.service => tizen-debug-off.service.in} | 3 +-- data/{tizen-debug-on.service => tizen-debug-on.service.in} | 3 +-- packaging/crash-worker.spec | 6 ++++-- src/crash-manager/crash-manager.c | 9 ++++----- src/crash-manager/crash-manager.h.in | 3 +-- 6 files changed, 14 insertions(+), 13 deletions(-) rename data/{tizen-debug-off.service => tizen-debug-off.service.in} (70%) rename data/{tizen-debug-on.service => tizen-debug-on.service.in} (64%) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 91a31e5..681894d 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -1,3 +1,6 @@ +CONFIGURE_FILE(tizen-debug-on.service.in tizen-debug-on.service @ONLY) +CONFIGURE_FILE(tizen-debug-off.service.in tizen-debug-off.service @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tizen-debug-on.service DESTINATION /usr/lib/systemd/system PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/data/tizen-debug-off.service b/data/tizen-debug-off.service.in similarity index 70% rename from data/tizen-debug-off.service rename to data/tizen-debug-off.service.in index 870964e..6d5ee4d 100644 --- a/data/tizen-debug-off.service +++ b/data/tizen-debug-off.service.in @@ -8,8 +8,7 @@ Before=sysinit.target SmackProcessLabel=System Type=oneshot RemainAfterExit=yes -ExecStart=/bin/rm -f /opt/etc/.debugmode -ExecStart=/sbin/sysctl kernel.core_pattern=/dev/null +ExecStart=/bin/rm -f @DEBUGMODE_PATH@ [Install] WantedBy=sysinit.target diff --git a/data/tizen-debug-on.service b/data/tizen-debug-on.service.in similarity index 64% rename from data/tizen-debug-on.service rename to data/tizen-debug-on.service.in index 22ae97a..da91aac 100644 --- a/data/tizen-debug-on.service +++ b/data/tizen-debug-on.service.in @@ -8,8 +8,7 @@ Before=sysinit.target SmackProcessLabel=System Type=oneshot RemainAfterExit=yes -ExecStart=/bin/touch -f /opt/etc/.debugmode -ExecStart=/sbin/sysctl -p /usr/lib/sysctl.d/99-crash-manager.conf +ExecStart=/bin/touch -f @DEBUGMODE_PATH@ [Install] WantedBy=sysinit.target diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index bddd690..5fff375 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -5,7 +5,6 @@ %define _with_tests on %define TIZEN_FEATURE_PTRACE_CALLSTACK on %bcond_with doc -%bcond_with core_dump %bcond_with sys_assert %bcond_with tests @@ -73,6 +72,9 @@ This package contains installable tests in Bash. %define crash_path %{TZ_SYS_CRASH} %define crash_temp %{crash_root_path}/temp +#Debug mode path - existence of file at path below mean that core file should be generated +%define debugmode_path %{TZ_SYS_ETC}/.debugmode + #Path for log_dump module %define crash_all_log %{TZ_SYS_ALLLOGS} %define crash_dump_gen %{TZ_SYS_DUMPGEN} @@ -106,6 +108,7 @@ export CFLAGS+=" -Werror" -DCRASH_ROOT_PATH=%{crash_root_path} \ -DCRASH_PATH=%{crash_path} \ -DCRASH_TEMP=%{crash_temp} \ + -DDEBUGMODE_PATH=%{debugmode_path} \ -DCRASH_PIPE_PATH=%{_libexecdir}/crash-pipe \ %if "%{TIZEN_FEATURE_PTRACE_CALLSTACK}" == "on" -DCRASH_STACK_PATH=%{_libexecdir}/crash-stack \ @@ -113,7 +116,6 @@ export CFLAGS+=" -Werror" -DCRASH_TESTS_PATH=%{_libdir}/crash-worker-tests \ -DSYS_ASSERT=%{on_off sys_assert} \ -DUPGRADE_SCRIPT_PATH=%{upgrade_script_path} \ - -DWITH_CORE_DUMP=%{on_off core_dump} \ -DTIZEN_FEATURE_PTRACE_CALLSTACK=%{TIZEN_FEATURE_PTRACE_CALLSTACK} make %{?jobs:-j%jobs} diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 60b24d4..3602596 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -40,8 +40,6 @@ #undef LOG_TAG #define LOG_TAG "CRASH_MANAGER" -#define DEBUGMODE_FILE tzplatform_mkpath(TZ_SYS_ETC, ".debugmode") - /* Parsing */ #define CRASH_CONF_FILE tzplatform_mkpath(TZ_SYS_ETC, "crash-manager.conf") #define KEY_MAX 255 @@ -783,6 +781,7 @@ int main(int argc, char *argv[]) { /* Execute dump_systemstate in parallel */ static int dump_state_pid; + int debug_mode = access(DEBUGMODE_PATH, F_OK) == 0; prctl(PR_SET_DUMPABLE, 0); @@ -806,7 +805,7 @@ int main(int argc, char *argv[]) dump_state_pid = dump_system_state(); /* Exec crash modules */ - execute_crash_modules(argc, argv, DEBUG); + execute_crash_modules(argc, argv, debug_mode); /* Wait dump_system_state */ wait_system_command(dump_state_pid); @@ -817,8 +816,8 @@ int main(int argc, char *argv[]) else move_dump_dir(); - /* .dbugmode: launch crash-popup */ - if (access(DEBUGMODE_FILE, F_OK) == 0) + /* launch crash-popup only if core file was saved ("debug mode")*/ + if (debug_mode) launch_crash_popup(); return 0; diff --git a/src/crash-manager/crash-manager.h.in b/src/crash-manager/crash-manager.h.in index 772177e..7a4089e 100644 --- a/src/crash-manager/crash-manager.h.in +++ b/src/crash-manager/crash-manager.h.in @@ -27,7 +27,6 @@ #define CRASH_STACK_PATH "@CRASH_STACK_PATH@" #endif #define CRASH_PIPE_PATH "@CRASH_PIPE_PATH@" - -#define DEBUG 1 +#define DEBUGMODE_PATH "@DEBUGMODE_PATH@" #endif -- 2.7.4 From 52a40d94946c7d9706587b056e5d70d1724cc4d5 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Thu, 11 May 2017 15:47:18 +0200 Subject: [PATCH 03/16] crash-stack: Change "ThreadID" heuristic to work on aarch64 Commit 82e3caa86 ("crash-stack: Find crashed tid by wchan") introduced heuristic method of finding correct thread id, if it was not passed by the kernel as parameter to crash-manager. This commit modifies this heuristic to also consider "pipe_wait" function in kernel to signify crashed thread. This is what was observed to be true on aarch64. Change-Id: Iefa6d028f459ff9491f8e184433f913f39a096eb --- src/crash-stack/crash-stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crash-stack/crash-stack.c b/src/crash-stack/crash-stack.c index 587e932..fd7bfbf 100644 --- a/src/crash-stack/crash-stack.c +++ b/src/crash-stack/crash-stack.c @@ -854,7 +854,7 @@ static int check_thread_wchan(int pid, int tid) buf[cnt] = 0; close(fd); - if (strncmp("do_coredump", buf, sizeof(buf)) == 0) + if (strncmp("do_coredump", buf, sizeof(buf)) == 0 || strncmp("pipe_wait", buf, sizeof(buf)) == 0) return tid; else return 0; -- 2.7.4 From 0bec17daa6b5e747a1c54d3e941806f696d6b04d Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Tue, 16 May 2017 15:25:06 +0200 Subject: [PATCH 04/16] crash-stack: Fix Tizen Coding Style violations Rules at: https://wiki.tizen.org/wiki/Native_Platform_Coding_Idiom_and_Style_Guide This commit brings no functional changes. Change-Id: Ic95fd2d1e5508d602fa24ea33933448c52ce625d --- src/crash-stack/crash-stack.c | 282 ++++++++++++++++++++++-------------------- 1 file changed, 146 insertions(+), 136 deletions(-) diff --git a/src/crash-stack/crash-stack.c b/src/crash-stack/crash-stack.c index fd7bfbf..30a432c 100644 --- a/src/crash-stack/crash-stack.c +++ b/src/crash-stack/crash-stack.c @@ -14,8 +14,8 @@ * limitations under the License. * * Authors: Adrian Szyndela - * Łukasz Stelmach - * Rafał Pietruch + * Łukasz Stelmach + * Rafał Pietruch */ #define _GNU_SOURCE 1 @@ -216,16 +216,13 @@ static void __print_proc_file(pid_t pid, pid_t tid, const char *name) fprintf(outputfile, "%s:\n", buf); f = fopen(buf, "r"); - if (NULL == f) - { + if (NULL == f) { fprintf(errfile, "Failed to open %s: %m\n", buf); return; } while ((r = fread(buf, 1, sizeof(buf), f)) > 0) - { fwrite(buf, r, 1, outputfile); - } fclose(f); @@ -254,14 +251,12 @@ static Dwfl *__open_dwfl_with_pid(pid_t pid, pid_t tid) pid_t stopped_pid; status = __attachable(pid, tid); - if (-1 == status) - { + if (-1 == status) { fprintf(errfile, "failed to read /proc/%d/task/%d/stat: %m\n", pid, tid); return NULL; } - if (!status) - { + if (!status) { __print_not_attachable_process_info(pid, tid); return NULL; } @@ -298,7 +293,7 @@ static Dwfl *__open_dwfl_with_pid(pid_t pid, pid_t tid) return NULL; } -#if _ELFUTILS_PREREQ(0,158) +#if _ELFUTILS_PREREQ(0, 158) if (dwfl_linux_proc_attach(dwfl, tid, true) < 0) { fprintf(errfile, "process %d : dwfl attach failed (%s)\n", tid, dwfl_errmsg(-1)); dwfl_end(dwfl); @@ -339,19 +334,41 @@ static int __get_registers_ptrace(pid_t pid) */ static void __crash_stack_print_signal(int signo) { +#define DEF_STR(name) [name] = #name const char* const signal_table[] = { - [SIGHUP]="SIGHUP", [SIGINT]="SIGINT", [SIGQUIT]="SIGQUIT", - [SIGILL]="SIGILL", [SIGTRAP]="SIGTRAP", [SIGABRT]="SIGABRT", - /* [SIGIOT]="SIGIOT", */ [SIGBUS]="SIGBUS", [SIGFPE]="SIGFPE", - [SIGKILL]="SIGKILL", [SIGUSR1]="SIGUSR1", [SIGSEGV]="SIGSEGV", - [SIGUSR2]="SIGUSR2", [SIGPIPE]="SIGPIPE", [SIGALRM]="SIGALRM", - [SIGTERM]="SIGTERM", [SIGSTKFLT]="SIGSTKFLT", [SIGCHLD]="SIGCHLD", - [SIGCONT]="SIGCONT", [SIGSTOP]="SIGSTOP", [SIGTSTP]="SIGTSTP", - [SIGTTIN]="SIGTTIN", [SIGTTOU]="SIGTTOU", [SIGURG]="SIGURG", - [SIGXCPU]="SIGXCPU", [SIGXFSZ]="SIGXFSZ", [SIGVTALRM]="SIGVTALRM", - [SIGPROF]="SIGPROF", [SIGWINCH]="SIGWINCH", [SIGIO]="SIGIO", - [SIGPWR]="SIGPWR", [SIGSYS]="SIGSYS", /* [SIGUNUSED]="SIGUNUSED", */ + DEF_STR(SIGHUP), + DEF_STR(SIGINT), + DEF_STR(SIGQUIT), + DEF_STR(SIGILL), + DEF_STR(SIGTRAP), + DEF_STR(SIGABRT), + DEF_STR(SIGBUS), + DEF_STR(SIGFPE), + DEF_STR(SIGKILL), + DEF_STR(SIGUSR1), + DEF_STR(SIGUSR2), + DEF_STR(SIGPIPE), + DEF_STR(SIGSEGV), + DEF_STR(SIGTERM), + DEF_STR(SIGSTKFLT), + DEF_STR(SIGCHLD), + DEF_STR(SIGCONT), + DEF_STR(SIGSTOP), + DEF_STR(SIGTSTP), + DEF_STR(SIGTTIN), + DEF_STR(SIGTTOU), + DEF_STR(SIGURG), + DEF_STR(SIGXCPU), + DEF_STR(SIGXFSZ), + DEF_STR(SIGVTALRM), + DEF_STR(SIGPROF), + DEF_STR(SIGWINCH), + DEF_STR(SIGPOLL), + DEF_STR(SIGIO), + DEF_STR(SIGPWR), + DEF_STR(SIGSYS) }; +#undef DEF_STR if (SIGHUP > signo || signo > SIGSYS) { fprintf(errfile, "Invalid signal number: %d\n", signo); @@ -393,10 +410,8 @@ static void __resolve_symbols_from_dwfl(ProcInfo *proc_info, Dwfl *dwfl) if (symbol) { free(proc_info->name); proc_info->name = strdup(symbol); - } - else if (proc_info->module_name != NULL) { + } else if (proc_info->module_name != NULL) __find_symbol_in_elf(proc_info, mapping_start); - } } } @@ -537,17 +552,15 @@ static void __crash_stack_print_exe(FILE* outputfile, pid_t pid) */ static void __crash_stack_print_threads(FILE* outputfile, pid_t pid, pid_t tid) { - int threadnum=1; + int threadnum = 1; DIR *dir; - struct dirent *dentry=NULL; + struct dirent *dentry = NULL; char task_path[PATH_MAX]; struct stat sb; - snprintf(task_path, PATH_MAX, "/proc/%d/task", pid); - if (stat(task_path, &sb) == -1) { + if (stat(task_path, &sb) == -1) return; - } threadnum = sb.st_nlink - 2; @@ -591,14 +604,13 @@ static void __crash_stack_print_maps(FILE* outputfile, pid_t pid) if ((fd = open(file_path, O_RDONLY)) < 0) { fprintf(errfile, "[crash-stack] cannot open %s\n", file_path); - } else { - /* parsing the maps to get code segment address*/ - head = get_addr_list_from_maps(fd); - close(fd); - } - if (head == NULL) { - return; + } else { + /* parsing the maps to get code segment address*/ + head = get_addr_list_from_maps(fd); + close(fd); } + if (head == NULL) + return; t_node = head; fprintf(outputfile, "\nMaps Information\n"); @@ -619,28 +631,27 @@ static void __crash_stack_print_maps(FILE* outputfile, pid_t pid) static struct addr_node *get_addr_list_from_maps(int fd) { - int fpath_len, result; - uintptr_t saddr; - uintptr_t eaddr; - char perm[PERM_LEN]; - char path[PATH_MAX]; - char addr[ADDR_LEN * 2 + 2]; - char linebuf[BUF_SIZE]; - struct addr_node *head = NULL; - struct addr_node *tail = NULL; - struct addr_node *t_node = NULL; - - /* parsing the maps to get executable code address */ - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - memset(path, 0, PATH_MAX); - result = sscanf(linebuf, "%s %s %*s %*s %*s %s ", addr, perm, path); - if (result < 0) - continue; - perm[PERM_LEN - 1] = 0; - /* rwxp */ - if ((perm[2] == 'x' && path[0] == '/') || - (perm[1] == 'w' && path[0] != '/')) - { + int fpath_len, result; + uintptr_t saddr; + uintptr_t eaddr; + char perm[PERM_LEN]; + char path[PATH_MAX]; + char addr[ADDR_LEN * 2 + 2]; + char linebuf[BUF_SIZE]; + struct addr_node *head = NULL; + struct addr_node *tail = NULL; + struct addr_node *t_node = NULL; + + /* parsing the maps to get executable code address */ + while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { + memset(path, 0, PATH_MAX); + result = sscanf(linebuf, "%s %s %*s %*s %*s %s ", addr, perm, path); + if (result < 0) + continue; + perm[PERM_LEN - 1] = 0; + /* rwxp */ + if ((perm[2] == 'x' && path[0] == '/') || + (perm[1] == 'w' && path[0] != '/')) { char* addr2 = strchr(addr, '-'); *(addr2++) = '\0'; /* add addr node to list */ @@ -710,17 +721,17 @@ static void free_all_nodes(struct addr_node *start) static char *fgets_fd(char *str, int len, int fd) { - char ch; - register char *cs; - int num = 0; - - cs = str; - while (--len > 0 && (num = read(fd, &ch, 1) > 0)) { - if ((*cs++ = ch) == '\n') - break; - } - *cs = '\0'; - return (num == 0 && cs == str) ? NULL : str; + char ch; + register char *cs; + int num = 0; + + cs = str; + while (--len > 0 && (num = read(fd, &ch, 1) > 0)) { + if ((*cs++ = ch) == '\n') + break; + } + *cs = '\0'; + return (num == 0 && cs == str) ? NULL : str; } /** @@ -739,72 +750,72 @@ static void __crash_stack_print_meminfo(FILE* outputfile, pid_t pid) fprintf(outputfile, "\nMemory information\n"); - if ((fd = open("/proc/meminfo", O_RDONLY)) < 0) { - fprintf(errfile, "[crash-stack] cannot open /proc/meminfo\n"); - } else { - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, "%s %s %*s", infoname, memsize); - if (strcmp("MemTotal:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, memsize); - } else if (strcmp("MemFree:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, memsize); - } else if (strcmp("Buffers:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, memsize); - } else if (strcmp("Cached:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, memsize); - break; - } - } - close(fd); - } + if ((fd = open("/proc/meminfo", O_RDONLY)) < 0) { + fprintf(errfile, "[crash-stack] cannot open /proc/meminfo\n"); + } else { + while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { + sscanf(linebuf, "%s %s %*s", infoname, memsize); + if (strcmp("MemTotal:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, memsize); + } else if (strcmp("MemFree:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, memsize); + } else if (strcmp("Buffers:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, memsize); + } else if (strcmp("Cached:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, memsize); + break; + } + } + close(fd); + } snprintf(file_path, PATH_MAX, "/proc/%d/status", pid); - if ((fd = open(file_path, O_RDONLY)) < 0) { - fprintf(errfile, "[crash-stack] cannot open %s\n", file_path); - } else { - while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, "%s %s %*s", infoname, memsize); - if (strcmp("VmPeak:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, - memsize); - } else if (strcmp("VmSize:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, - memsize); - } else if (strcmp("VmLck:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, - memsize); - } else if (strcmp("VmPin:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", infoname, - memsize); - } else if (strcmp("VmHWM:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmRSS:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmData:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmStk:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmExe:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmLib:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmPTE:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - } else if (strcmp("VmSwap:", infoname) == 0) { - fprintf(outputfile, "%s %8s KB\n", - infoname, memsize); - break; - } - } - close(fd); - } + if ((fd = open(file_path, O_RDONLY)) < 0) { + fprintf(errfile, "[crash-stack] cannot open %s\n", file_path); + } else { + while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { + sscanf(linebuf, "%s %s %*s", infoname, memsize); + if (strcmp("VmPeak:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, + memsize); + } else if (strcmp("VmSize:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, + memsize); + } else if (strcmp("VmLck:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, + memsize); + } else if (strcmp("VmPin:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", infoname, + memsize); + } else if (strcmp("VmHWM:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmRSS:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmData:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmStk:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmExe:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmLib:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmPTE:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + } else if (strcmp("VmSwap:", infoname) == 0) { + fprintf(outputfile, "%s %8s KB\n", + infoname, memsize); + break; + } + } + close(fd); + } } /** @@ -875,9 +886,8 @@ static int find_crash_tid(int pid) struct stat sb; snprintf(task_path, PATH_MAX, "/proc/%d/task", pid); - if (stat(task_path, &sb) == -1) { + if (stat(task_path, &sb) == -1) return -1; - } threadnum = sb.st_nlink - 2; -- 2.7.4 From 1f3072e5db73d37acd5d4eff30b42a178dcb267e Mon Sep 17 00:00:00 2001 From: Sunmin Lee Date: Thu, 8 Jun 2017 14:05:57 +0900 Subject: [PATCH 05/16] Fix sscanf vulnerability Specify a limit on the input string length and keep the last byte for null character. Change-Id: I717ac2ae565f2627e5de26426ec24c6ccf772c5e Signed-off-by: Sunmin Lee --- src/sys-assert/sys-assert.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/sys-assert/sys-assert.c b/src/sys-assert/sys-assert.c index 63f362e..275653d 100644 --- a/src/sys-assert/sys-assert.c +++ b/src/sys-assert/sys-assert.c @@ -65,13 +65,20 @@ #define HEXA 16 #define PERM_LEN 5 +#define PERM_LEN_DEC 4 #ifdef ARCH_64 #define ADDR_LEN 10 +#define ADDR_LEN_DOUBLE 20 +#define ADDR_LEN_DOUBLE_DEC 19 #else #define ADDR_LEN 8 +#define ADDR_LEN_DOUBLE 16 +#define ADDR_LEN_DOUBLE_DEC 15 #endif #define INFO_LEN 20 +#define INFO_LEN_DEC 19 #define VALUE_LEN 24 +#define VALUE_LEN_DEC 23 #define TIME_MAX_LEN 64 #define FILE_LEN 255 #define BUF_SIZE (BUFSIZ) @@ -79,6 +86,9 @@ #define FUNC_NAME_MAX_LEN 128 #define PATH_LEN (FILE_LEN + NAME_MAX) +#define STRING_FORMAT_SPECIFIER_WITH_MACRO(macro) "%"#macro"s" +#define STR_FS(macro) STRING_FORMAT_SPECIFIER_WITH_MACRO(macro) + #define KB(bytes) ((bytes)/1024) /* permission for open file */ @@ -322,7 +332,7 @@ static struct addr_node *get_addr_list_from_maps(int fd) long *saddr; long *eaddr; char perm[PERM_LEN]; - char path[PATH_LEN]; + char path[PATH_MAX + 1]; char addr[ADDR_LEN * 2]; char linebuf[BUF_SIZE]; struct addr_node *head = NULL; @@ -331,8 +341,11 @@ static struct addr_node *get_addr_list_from_maps(int fd) /* parsing the maps to get executable code address */ while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - memset(path, 0, PATH_LEN); - result = sscanf(linebuf, "%s %s %*s %*s %*s %s ", addr, perm, path); + memset(path, 0, PATH_MAX + 1); + result = sscanf(linebuf, STR_FS(ADDR_LEN_DOUBLE_DEC) + STR_FS(PERM_LEN_DEC) + "%*s %*s %*s" + STR_FS(PATH_MAX), addr, perm, path); if (result < 0) continue; perm[PERM_LEN - 1] = 0; @@ -599,7 +612,7 @@ void sighandler(int signum, siginfo_t *info, void *context) pid_t pid; pid_t tid; DIR *dir; - struct dirent *dentry=NULL; + struct dirent *dentry = NULL; char timestr[TIME_MAX_LEN]; char processname[NAME_MAX] = {0,}; char exepath[PATH_LEN] = {0,}; @@ -707,7 +720,9 @@ void sighandler(int signum, siginfo_t *info, void *context) fprintf(stderr, "[sys-assert]can't open %s\n", MEMINFO_PATH); } else { while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, "%s %s %*s", infoname, value); + sscanf(linebuf, STR_FS(INFO_LEN_DEC) + STR_FS(VALUE_LEN_DEC) + "%*s", infoname, value); if (strcmp("Cached:", infoname) == 0) { fprintf_fd(fd_cs, "%s %8s KB\n", infoname, value); break; @@ -721,7 +736,9 @@ void sighandler(int signum, siginfo_t *info, void *context) fprintf(stderr, "[sys-assert]can't open %s\n", STATUS_PATH); } else { while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { - sscanf(linebuf, "%s %s %*s", infoname, value); + sscanf(linebuf, STR_FS(INFO_LEN_DEC) + STR_FS(VALUE_LEN_DEC) + "%*s", infoname, value); if (strcmp("VmPeak:", infoname) == 0) { fprintf_fd(fd_cs, "%s %8s KB\n", infoname, value); -- 2.7.4 From 4aa86bb737afd482172fe73c113e5339d2013be1 Mon Sep 17 00:00:00 2001 From: Sunmin Lee Date: Fri, 9 Jun 2017 12:58:48 +0900 Subject: [PATCH 06/16] Adjust buffer size for address The addr gets string of address consisting of begin/end address and '-', null character. So the length of addrees buffer should be set to: ADDR_LEN * 2 + 2 (at least) Change-Id: I6cdb8530be50c4c29fbb51a5dcb5fa8e094e5352 Signed-off-by: Sunmin Lee --- src/sys-assert/sys-assert.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sys-assert/sys-assert.c b/src/sys-assert/sys-assert.c index 275653d..75c7c3b 100644 --- a/src/sys-assert/sys-assert.c +++ b/src/sys-assert/sys-assert.c @@ -68,12 +68,12 @@ #define PERM_LEN_DEC 4 #ifdef ARCH_64 #define ADDR_LEN 10 -#define ADDR_LEN_DOUBLE 20 -#define ADDR_LEN_DOUBLE_DEC 19 +#define ADDR_BUF_LEN 22 +#define ADDR_BUF_LEN_DEC 21 #else #define ADDR_LEN 8 -#define ADDR_LEN_DOUBLE 16 -#define ADDR_LEN_DOUBLE_DEC 15 +#define ADDR_BUF_LEN 18 +#define ADDR_BUF_LEN_DEC 17 #endif #define INFO_LEN 20 #define INFO_LEN_DEC 19 @@ -333,7 +333,7 @@ static struct addr_node *get_addr_list_from_maps(int fd) long *eaddr; char perm[PERM_LEN]; char path[PATH_MAX + 1]; - char addr[ADDR_LEN * 2]; + char addr[ADDR_BUF_LEN]; char linebuf[BUF_SIZE]; struct addr_node *head = NULL; struct addr_node *tail = NULL; @@ -342,7 +342,7 @@ static struct addr_node *get_addr_list_from_maps(int fd) /* parsing the maps to get executable code address */ while (fgets_fd(linebuf, BUF_SIZE, fd) != NULL) { memset(path, 0, PATH_MAX + 1); - result = sscanf(linebuf, STR_FS(ADDR_LEN_DOUBLE_DEC) + result = sscanf(linebuf, STR_FS(ADDR_BUF_LEN_DEC) STR_FS(PERM_LEN_DEC) "%*s %*s %*s" STR_FS(PATH_MAX), addr, perm, path); -- 2.7.4 From 1bb5a2c03b25f07607f6d134ba2de0578d290b00 Mon Sep 17 00:00:00 2001 From: minsoo kim Date: Fri, 26 May 2017 18:58:35 +0900 Subject: [PATCH 07/16] log_dump: selective mode for dbus activation log_dump running root in debug mode, and none_root with normal mode. Simplify org.tizen.system.crash.service conditional compile by using m4 Change-Id: I04b734f722266264434b27e9fe7b17cdc73263f1 Signed-off-by: minsoo kim Signed-off-by: Sunmin Lee --- cmake/ProcessM4.cmake | 11 +++++++++++ packaging/crash-worker.spec | 5 +++-- src/log_dump/CMakeLists.txt | 10 ++++++++++ ...system.crash.service => org.tizen.system.crash.service.m4} | 6 +++++- 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 cmake/ProcessM4.cmake rename src/log_dump/{org.tizen.system.crash.service => org.tizen.system.crash.service.m4} (52%) diff --git a/cmake/ProcessM4.cmake b/cmake/ProcessM4.cmake new file mode 100644 index 0000000..09ba1c9 --- /dev/null +++ b/cmake/ProcessM4.cmake @@ -0,0 +1,11 @@ +MACRO(PROCESS_M4 _defines _input _output) + GET_FILENAME_COMPONENT(_name ${_output} NAME) + ADD_CUSTOM_COMMAND( + OUTPUT ${_output} + COMMAND m4 + ARGS -P ${_defines} ${_input} > ${_output} + DEPENDS ${_input} + VERBATIM) + ADD_CUSTOM_TARGET(M4_${_name} DEPENDS ${_output}) + ADD_DEPENDENCIES(${PROJECT_NAME} M4_${_name}) +ENDMACRO(PROCESS_M4) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 5fff375..a140193 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -10,8 +10,8 @@ Name: crash-worker Summary: Crash-manager -Version: 1.0.0 -Release: 2 +Version: 1.0.1 +Release: 3 Group: Framework/system License: Apache-2.0 Source0: %{name}-%{version}.tar.gz @@ -85,6 +85,7 @@ This package contains installable tests in Bash. cp %{SOURCE1001} . export CFLAGS+=" -Werror" +export CFLAGS+=" -DTIZEN_DEBUG_MODE" %ifarch %{arm} aarch64 %define ARCH arm diff --git a/src/log_dump/CMakeLists.txt b/src/log_dump/CMakeLists.txt index 20202b6..e205994 100644 --- a/src/log_dump/CMakeLists.txt +++ b/src/log_dump/CMakeLists.txt @@ -16,16 +16,26 @@ pkg_check_modules(log_dump_pkgs REQUIRED gio-2.0 ) +INCLUDE(${CMAKE_SOURCE_DIR}/cmake/ProcessM4.cmake) + FOREACH(flag ${log_dump_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_DEBUG_MODE") + SET(M4_DEFINES ${M4_DEFINES} -DUSE_DEBUG_MODE) +ENDIF() + CONFIGURE_FILE(log_dump.h.in log_dump.h @ONLY) ADD_EXECUTABLE(${PROJECT_NAME} ${LOG_DUMP_SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${log_dump_pkgs_LDFLAGS} -pie) +PROCESS_M4("${M4_DEFINES}" + "${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service.m4" + "${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service") + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service DESTINATION /usr/share/dbus-1/system-services) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/log_dump.conf diff --git a/src/log_dump/org.tizen.system.crash.service b/src/log_dump/org.tizen.system.crash.service.m4 similarity index 52% rename from src/log_dump/org.tizen.system.crash.service rename to src/log_dump/org.tizen.system.crash.service.m4 index 1e9a605..58ea606 100644 --- a/src/log_dump/org.tizen.system.crash.service +++ b/src/log_dump/org.tizen.system.crash.service.m4 @@ -1,5 +1,9 @@ [D-BUS Service] Name=org.tizen.system.crash Exec=/usr/bin/log_dump --dbus +m4_ifdef(`USE_DEBUG_MODE', User=root -Group=root +Group=root, +User=system_fw +Group=system_share +) -- 2.7.4 From 6df83d126bac7ad5d1ad2a0c58cb18230683466c Mon Sep 17 00:00:00 2001 From: Kunhoon Baik Date: Tue, 27 Jun 2017 16:07:40 +0900 Subject: [PATCH 08/16] Preparation of debug & release package Some vendor would like to have different crash management policy for debug and release image. Thus, Tizen will provide crash-manager debug and release package. This patch is the preparation for the package separation. In case of crash-manager debug, following CFLAGS will be enabled. export CFLAGS+=" -DTIZEN_ENGINEER_MODE" export CFLAGS+=" -DTIZEN_ENABLE_COREDUMP" In the future, export CFLAGS+=" -DTIZEN_DEBUG_ENABLE" may be added. Basically, default Tizen image will include crash management policy for debug mode. cf) .debugmode file will be used for just crash-popup control for 3.0 compatibility. Change-Id: I892d1f0d5de65da0abb3e002fa235989f43def56 --- data/tizen-debug-off.service.in | 1 + data/tizen-debug-on.service.in | 1 + packaging/crash-worker.spec | 3 +- src/crash-manager/99-crash-manager-debug.conf.in | 4 +++ src/crash-manager/99-crash-manager.conf.in | 1 - src/crash-manager/CMakeLists.txt | 12 +++++++- src/crash-manager/crash-manager.c | 38 +++++++++++++----------- src/log_dump/CMakeLists.txt | 4 +-- src/log_dump/org.tizen.system.crash.service.m4 | 2 +- 9 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 src/crash-manager/99-crash-manager-debug.conf.in diff --git a/data/tizen-debug-off.service.in b/data/tizen-debug-off.service.in index 6d5ee4d..c589bbb 100644 --- a/data/tizen-debug-off.service.in +++ b/data/tizen-debug-off.service.in @@ -9,6 +9,7 @@ SmackProcessLabel=System Type=oneshot RemainAfterExit=yes ExecStart=/bin/rm -f @DEBUGMODE_PATH@ +ExecStart=/sbin/sysctl -p /usr/lib/sysctl.d/99-crash-manager.conf [Install] WantedBy=sysinit.target diff --git a/data/tizen-debug-on.service.in b/data/tizen-debug-on.service.in index da91aac..e72ca2a 100644 --- a/data/tizen-debug-on.service.in +++ b/data/tizen-debug-on.service.in @@ -9,6 +9,7 @@ SmackProcessLabel=System Type=oneshot RemainAfterExit=yes ExecStart=/bin/touch -f @DEBUGMODE_PATH@ +ExecStart=/sbin/sysctl -p /usr/lib/sysctl.d/99-crash-manager.conf [Install] WantedBy=sysinit.target diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index a140193..13a0224 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -85,7 +85,8 @@ This package contains installable tests in Bash. cp %{SOURCE1001} . export CFLAGS+=" -Werror" -export CFLAGS+=" -DTIZEN_DEBUG_MODE" +export CFLAGS+=" -DTIZEN_ENGINEER_MODE" +export CFLAGS+=" -DTIZEN_ENABLE_COREDUMP" %ifarch %{arm} aarch64 %define ARCH arm diff --git a/src/crash-manager/99-crash-manager-debug.conf.in b/src/crash-manager/99-crash-manager-debug.conf.in new file mode 100644 index 0000000..3fa5692 --- /dev/null +++ b/src/crash-manager/99-crash-manager-debug.conf.in @@ -0,0 +1,4 @@ +# Tizen crash-manager +kernel.core_pattern=|/usr/bin/crash-manager %p %u %g %s %t %i +kernel.core_pipe_limit=10 +fs.suid_dumpable=1 diff --git a/src/crash-manager/99-crash-manager.conf.in b/src/crash-manager/99-crash-manager.conf.in index 3fa5692..5961717 100644 --- a/src/crash-manager/99-crash-manager.conf.in +++ b/src/crash-manager/99-crash-manager.conf.in @@ -1,4 +1,3 @@ # Tizen crash-manager kernel.core_pattern=|/usr/bin/crash-manager %p %u %g %s %t %i kernel.core_pipe_limit=10 -fs.suid_dumpable=1 diff --git a/src/crash-manager/CMakeLists.txt b/src/crash-manager/CMakeLists.txt index 357fcaa..a474f33 100644 --- a/src/crash-manager/CMakeLists.txt +++ b/src/crash-manager/CMakeLists.txt @@ -25,6 +25,10 @@ ENDFOREACH(flag) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_ENABLE_COREDUMP") + OPTION(USE_COREDUMP_CONF "Use COREDUMP CONF" ON) +ENDIF() + CONFIGURE_FILE(crash-manager.h.in crash-manager.h @ONLY) ADD_EXECUTABLE(${PROJECT_NAME} ${CRASH_MANAGER_SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${crash-manager_pkgs_LDFLAGS} -pie) @@ -33,9 +37,15 @@ INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) -CONFIGURE_FILE(99-${PROJECT_NAME}.conf.in 99-${PROJECT_NAME}.conf @ONLY) CONFIGURE_FILE(500.${PROJECT_NAME}-upgrade.sh.in 500.${PROJECT_NAME}-upgrade.sh @ONLY) +IF(USE_COREDUMP_CONF) + CONFIGURE_FILE(99-${PROJECT_NAME}-debug.conf.in 99-${PROJECT_NAME}.conf @ONLY) +ELSE() + CONFIGURE_FILE(99-${PROJECT_NAME}.conf.in 99-${PROJECT_NAME}.conf @ONLY) +ENDIF(USE_COREDUMP_CONF) + + INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${PROJECT_NAME}/crash-manager.conf DESTINATION ${TZ_SYS_ETC} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 3602596..1d91d3a 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -165,7 +165,7 @@ static void get_config(void) value = iniparser_getboolean(ini, key, -1); if (value < 0) { _D("Invalid value for AllowZip. Use default value [ %s ]", - ALLOW_ZIP ? "true" : "false" ); + ALLOW_ZIP ? "true" : "false"); } else { _D("AllowZip [ %s ]", value ? "true" : "false"); allow_zip = value; @@ -380,6 +380,7 @@ static int get_sysassert_cs(void) } #endif +#ifdef TIZEN_ENABLE_COREDUMP static void launch_crash_popup(void) { GDBusConnection *conn; @@ -430,6 +431,7 @@ exit: if (parameters) g_variant_unref(parameters); } +#endif static int dump_system_state(void) { @@ -446,24 +448,23 @@ static int dump_system_state(void) return system_command_parallel(command); } - -static void execute_crash_modules(int argc, char *argv[], int debug) +static void execute_crash_modules(int argc, char *argv[]) { int ret; char command[PATH_MAX]; +#ifdef TIZEN_ENABLE_COREDUMP /* Execute crash-pipe */ - if (debug) { - ret = snprintf(command, sizeof(command), - "%s --save-core %s", - CRASH_PIPE_PATH, - crash_info.core_path); - if (ret < 0) { - _E("Failed to snprintf for crash-pipe command"); - return; - } - system_command(command); + ret = snprintf(command, sizeof(command), + "%s --save-core %s", + CRASH_PIPE_PATH, + crash_info.core_path); + if (ret < 0) { + _E("Failed to snprintf for crash-pipe command"); + return; } + system_command(command); +#endif #ifdef TIZEN_FEATURE_PTRACE_CALLSTACK @@ -551,7 +552,7 @@ static int scan_dump(struct file_info **dump_list, size_t *usage) int i, scan_num, dump_num = 0; int fd; - if ((fd = open(CRASH_PATH, O_DIRECTORY)) < 0 ) { + if ((fd = open(CRASH_PATH, O_DIRECTORY)) < 0) { _E("Failed to open %s", CRASH_PATH); return -1; } @@ -781,7 +782,9 @@ int main(int argc, char *argv[]) { /* Execute dump_systemstate in parallel */ static int dump_state_pid; +#ifdef TIZEN_ENABLE_COREDUMP int debug_mode = access(DEBUGMODE_PATH, F_OK) == 0; +#endif prctl(PR_SET_DUMPABLE, 0); @@ -805,7 +808,7 @@ int main(int argc, char *argv[]) dump_state_pid = dump_system_state(); /* Exec crash modules */ - execute_crash_modules(argc, argv, debug_mode); + execute_crash_modules(argc, argv); /* Wait dump_system_state */ wait_system_command(dump_state_pid); @@ -815,10 +818,11 @@ int main(int argc, char *argv[]) compress(); else move_dump_dir(); - - /* launch crash-popup only if core file was saved ("debug mode")*/ +#ifdef TIZEN_ENABLE_COREDUMP + /* launch crash-popup only if the .debugmode file is exist*/ if (debug_mode) launch_crash_popup(); +#endif return 0; } diff --git a/src/log_dump/CMakeLists.txt b/src/log_dump/CMakeLists.txt index e205994..46af7ef 100644 --- a/src/log_dump/CMakeLists.txt +++ b/src/log_dump/CMakeLists.txt @@ -24,8 +24,8 @@ ENDFOREACH(flag) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE") -IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_DEBUG_MODE") - SET(M4_DEFINES ${M4_DEFINES} -DUSE_DEBUG_MODE) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_ENGINEER_MODE") + SET(M4_DEFINES ${M4_DEFINES} -DUSE_ENGINEER_MODE) ENDIF() CONFIGURE_FILE(log_dump.h.in log_dump.h @ONLY) diff --git a/src/log_dump/org.tizen.system.crash.service.m4 b/src/log_dump/org.tizen.system.crash.service.m4 index 58ea606..b1d199f 100644 --- a/src/log_dump/org.tizen.system.crash.service.m4 +++ b/src/log_dump/org.tizen.system.crash.service.m4 @@ -1,7 +1,7 @@ [D-BUS Service] Name=org.tizen.system.crash Exec=/usr/bin/log_dump --dbus -m4_ifdef(`USE_DEBUG_MODE', +m4_ifdef(`USE_ENGINEER_MODE', User=root Group=root, User=system_fw -- 2.7.4 From af001123323e42e3fe0a4eed19baa89f2b594a98 Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Tue, 23 May 2017 15:01:36 +0200 Subject: [PATCH 09/16] packaging: Disable sys-assert Ptrace-based mechanism (crash-stack) should be used as default and only mechanism for crash-report generation. Change-Id: I102fc02e5538dcf9f21d7b72ff8892e1b3500265 --- packaging/crash-worker.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 13a0224..b17ed76 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -1,7 +1,6 @@ # "on_off foo" wil turn into "ON" or "OFF" %define on_off() %{expand:%%{?with_%{1}:ON}%%{!?with_%{1}:OFF}} -%define _with_sys_assert on %define _with_tests on %define TIZEN_FEATURE_PTRACE_CALLSTACK on %bcond_with doc -- 2.7.4 From 549b3fc6f0134b39e2407e632e688fc5314b0517 Mon Sep 17 00:00:00 2001 From: Sunmin Lee Date: Wed, 9 Aug 2017 19:38:41 +0900 Subject: [PATCH 10/16] Apply ASLR to executables: crash-pipe, crash-stack Change-Id: Ia4a0452832a705f6fbac8034d7da93297883e4bc Signed-off-by: Sunmin Lee --- src/crash-pipe/CMakeLists.txt | 2 ++ src/crash-stack/CMakeLists.txt | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/crash-pipe/CMakeLists.txt b/src/crash-pipe/CMakeLists.txt index 7405769..3a63f89 100644 --- a/src/crash-pipe/CMakeLists.txt +++ b/src/crash-pipe/CMakeLists.txt @@ -1,5 +1,7 @@ set(CRASH_PIPE_BIN "crash-pipe") set(CRASH_PIPE_SRCS crash-pipe.c) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fPIE") +set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") add_executable(${CRASH_PIPE_BIN} ${CRASH_PIPE_SRCS}) install(TARGETS ${CRASH_PIPE_BIN} DESTINATION libexec) diff --git a/src/crash-stack/CMakeLists.txt b/src/crash-stack/CMakeLists.txt index 77ff0ce..3e41269 100644 --- a/src/crash-stack/CMakeLists.txt +++ b/src/crash-stack/CMakeLists.txt @@ -20,6 +20,9 @@ else() set(CRASH_STACK_SRCS ${CRASH_STACK_SRCS} crash-stack-stub.c) endif() +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fPIE") +set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + # Binary add_executable(${CRASH_STACK_BIN} ${CRASH_STACK_SRCS}) -- 2.7.4 From d27d2614adb52df492c8cae09256eb7c90f612c8 Mon Sep 17 00:00:00 2001 From: minsoo kim Date: Wed, 10 May 2017 11:09:09 +0900 Subject: [PATCH 11/16] crash-worker: change permission to none root process for reduce root permission, change to system_fw Change-Id: I04fafa89d2a4e0a1e3bc5a6e0019b2aebb428235 Signed-off-by: minsoo kim --- packaging/crash-worker.spec | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index b17ed76..28bf7fe 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -170,15 +170,15 @@ sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload %files %license LICENSE %manifest crash-worker.manifest -%defattr(-,system,system,-) +%defattr(-,system_fw,system_fw,-) %dir %{crash_root_path} %dir %{crash_path} %dir %{crash_temp} %dir %{crash_all_log} %{crash_dump_gen}/* -%attr(0755,root,root) %{_bindir}/* -%attr(0644,root,root) %{_unitdir}/tizen-debug-on.service -%attr(0644,root,root) %{_unitdir}/tizen-debug-off.service +%attr(0750,system_fw,system_fw) %{_bindir}/* +%attr(0644,root,system) %{_unitdir}/tizen-debug-on.service +%attr(0644,root,system) %{_unitdir}/tizen-debug-off.service %{TZ_SYS_ETC}/crash-manager.conf %attr(-,root,root) %{_sysconfdir}/dbus-1/system.d/log_dump.conf %attr(-,root,root) %{_prefix}/lib/sysctl.d/99-crash-manager.conf -- 2.7.4 From 1d386094e4f993c5cd5ffcf0a1089cad156c4586 Mon Sep 17 00:00:00 2001 From: minsoo kim Date: Mon, 3 Jul 2017 14:04:22 +0900 Subject: [PATCH 12/16] crash-worker: add supplementarygroups log systemd-journal To gather dlog, journal log, add supplementarygroups to service But dbus activation not applied suppplementarygroup, So rearrange service role org.tizen.system.crash.service : dbus activation log_dump.service : log_dump daemon Change-Id: I93e2bb5142a83f6dfa9ad56197916855988501ee Signed-off-by: minsoo kim --- packaging/crash-worker.spec | 1 + src/log_dump/CMakeLists.txt | 10 ++++++++-- src/log_dump/log_dump.service.m4 | 16 ++++++++++++++++ src/log_dump/org.tizen.system.crash.service | 4 ++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/log_dump/log_dump.service.m4 create mode 100644 src/log_dump/org.tizen.system.crash.service diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 28bf7fe..2ebc8df 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -177,6 +177,7 @@ sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload %dir %{crash_all_log} %{crash_dump_gen}/* %attr(0750,system_fw,system_fw) %{_bindir}/* +%attr(0644,system_fw,system_share) %{_unitdir}/log_dump.service %attr(0644,root,system) %{_unitdir}/tizen-debug-on.service %attr(0644,root,system) %{_unitdir}/tizen-debug-off.service %{TZ_SYS_ETC}/crash-manager.conf diff --git a/src/log_dump/CMakeLists.txt b/src/log_dump/CMakeLists.txt index 46af7ef..0cac32e 100644 --- a/src/log_dump/CMakeLists.txt +++ b/src/log_dump/CMakeLists.txt @@ -33,13 +33,19 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${LOG_DUMP_SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${log_dump_pkgs_LDFLAGS} -pie) PROCESS_M4("${M4_DEFINES}" - "${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service.m4" - "${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service") + "${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service.m4" + "${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service") INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.tizen.system.crash.service DESTINATION /usr/share/dbus-1/system-services) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/log_dump.conf DESTINATION /etc/dbus-1/system.d) + +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/log_dump.service DESTINATION /usr/lib/systemd/system + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) + INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/src/log_dump/log_dump.service.m4 b/src/log_dump/log_dump.service.m4 new file mode 100644 index 0000000..3e31e3d --- /dev/null +++ b/src/log_dump/log_dump.service.m4 @@ -0,0 +1,16 @@ +[Unit] +Description=log_dump service + +[Service] +SmackProcessLabel=System +Type=oneshot +Nice=-5 +KillMode=process +ExecStart=/usr/bin/log_dump --dbus +m4_ifdef('USE_ENGINEER_MODE', +User=root +Group=root, +User=system_fw +Group=system_fw +) +SupplementaryGroups=log systemd-journal diff --git a/src/log_dump/org.tizen.system.crash.service b/src/log_dump/org.tizen.system.crash.service new file mode 100644 index 0000000..5dfa56b --- /dev/null +++ b/src/log_dump/org.tizen.system.crash.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.tizen.system.crash +Exec=/bin/false +SystemdService=log_dump.service -- 2.7.4 From 86f46cf20fef04795f50548d6311b29f9719b921 Mon Sep 17 00:00:00 2001 From: minsoo kim Date: Mon, 21 Aug 2017 14:49:32 +0900 Subject: [PATCH 13/16] crash-worker: add dump_systemstate memps Change-Id: I50fbdc296a0ab8dfab96cfde29b0c3afa94eb1e7 Signed-off-by: minsoo kim --- src/dump_systemstate/dump_systemstate.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dump_systemstate/dump_systemstate.c b/src/dump_systemstate/dump_systemstate.c index 0359a6a..673ca9a 100644 --- a/src/dump_systemstate/dump_systemstate.c +++ b/src/dump_systemstate/dump_systemstate.c @@ -167,12 +167,12 @@ int main(int argc, char *argv[]) if (ret < 0) goto exit_close; - if (is_root) { - fprintf_fd(out_fd, "\n==== System memory statistics (/usr/bin/memps -v)\n"); - ret = run_command_write_fd("/usr/bin/memps -v", out_fd); - if (ret < 0) - goto exit_close; + fprintf_fd(out_fd, "\n==== System memory statistics (/usr/bin/memps -v)\n"); + ret = run_command_write_fd("/usr/bin/memps -v", out_fd); + if (ret < 0) + goto exit_close; + if (is_root) { fprintf_fd(out_fd, "\n==== System configuration (/usr/bin/vconftool get memory, db, file)\n"); ret = run_command_write_fd("/usr/bin/vconftool get memory/ -r", out_fd); if (ret < 0) -- 2.7.4 From 51591b503f720083f89b4c529c263e02eac7a11d Mon Sep 17 00:00:00 2001 From: ByungSoo Kim Date: Mon, 21 Aug 2017 23:24:00 +0900 Subject: [PATCH 14/16] log_dump: assign CAP_SYS_PTRACE capability When log_dump has system_fw permission, memps which is forked from /usr/bin/dump_systemstate can't read /proc/self/maps and /proc/self/smaps. It requires CAP_SYS_PTRACE capability. So, it should have CAP_SYS_PTRACE capability and inheritance attribute. Change-Id: If2bd16964dba8e616e4a4fcc5cd489feb4c40b21 Signed-off-by: ByungSoo Kim --- src/log_dump/log_dump.service.m4 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/log_dump/log_dump.service.m4 b/src/log_dump/log_dump.service.m4 index 3e31e3d..a78d097 100644 --- a/src/log_dump/log_dump.service.m4 +++ b/src/log_dump/log_dump.service.m4 @@ -12,5 +12,8 @@ User=root Group=root, User=system_fw Group=system_fw +SecureBits=keep-caps +Capabilities=cap_sys_ptrace=eip +CapabilityBoundingSet=CAP_SYS_PTRACE ) SupplementaryGroups=log systemd-journal -- 2.7.4 From b17719a3079a4200b1fe5d40df960698cb2a5c59 Mon Sep 17 00:00:00 2001 From: Sunmin Lee Date: Tue, 12 Sep 2017 16:28:52 +0900 Subject: [PATCH 15/16] Remove unused file Remove unused file Change-Id: Iabe9ee9e49cf9f4272c3a3691f48f3c75ff0a281 Signed-off-by: Sunmin Lee --- src/log_dump/org.tizen.system.crash.service.m4 | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/log_dump/org.tizen.system.crash.service.m4 diff --git a/src/log_dump/org.tizen.system.crash.service.m4 b/src/log_dump/org.tizen.system.crash.service.m4 deleted file mode 100644 index b1d199f..0000000 --- a/src/log_dump/org.tizen.system.crash.service.m4 +++ /dev/null @@ -1,9 +0,0 @@ -[D-BUS Service] -Name=org.tizen.system.crash -Exec=/usr/bin/log_dump --dbus -m4_ifdef(`USE_ENGINEER_MODE', -User=root -Group=root, -User=system_fw -Group=system_share -) -- 2.7.4 From 9ef91ff21981c0a2f6c122dbc47bd1749f16e82d Mon Sep 17 00:00:00 2001 From: Sunmin Lee Date: Wed, 13 Sep 2017 14:36:18 +0900 Subject: [PATCH 16/16] Fix bugs - Fix misspelling for m4 condition - Do not install unused services: tizen-debug-on/off Change-Id: I09296e1365407c93ebb6dd9897ccc5b9e346bddd Signed-off-by: Sunmin Lee --- CMakeLists.txt | 2 +- packaging/crash-worker.spec | 2 -- src/log_dump/log_dump.service.m4 | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6982d26..d55fc2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,6 @@ ENDIF() ADD_SUBDIRECTORY(src/dump_systemstate) ADD_SUBDIRECTORY(src/log_dump) -ADD_SUBDIRECTORY(data) +#ADD_SUBDIRECTORY(data) ADD_SUBDIRECTORY(tests) diff --git a/packaging/crash-worker.spec b/packaging/crash-worker.spec index 2ebc8df..0584e3e 100644 --- a/packaging/crash-worker.spec +++ b/packaging/crash-worker.spec @@ -178,8 +178,6 @@ sed -i "/${pattern}/D" %{_sysconfdir}/ld.so.preload %{crash_dump_gen}/* %attr(0750,system_fw,system_fw) %{_bindir}/* %attr(0644,system_fw,system_share) %{_unitdir}/log_dump.service -%attr(0644,root,system) %{_unitdir}/tizen-debug-on.service -%attr(0644,root,system) %{_unitdir}/tizen-debug-off.service %{TZ_SYS_ETC}/crash-manager.conf %attr(-,root,root) %{_sysconfdir}/dbus-1/system.d/log_dump.conf %attr(-,root,root) %{_prefix}/lib/sysctl.d/99-crash-manager.conf diff --git a/src/log_dump/log_dump.service.m4 b/src/log_dump/log_dump.service.m4 index a78d097..07b024c 100644 --- a/src/log_dump/log_dump.service.m4 +++ b/src/log_dump/log_dump.service.m4 @@ -7,7 +7,7 @@ Type=oneshot Nice=-5 KillMode=process ExecStart=/usr/bin/log_dump --dbus -m4_ifdef('USE_ENGINEER_MODE', +m4_ifdef(`USE_ENGINEER_MODE', User=root Group=root, User=system_fw -- 2.7.4