From 7f092270b7a55c4af3202a439c771cf182f50152 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Thu, 31 Mar 2016 14:34:37 +0900 Subject: [PATCH] Support debug tool - Remove hardcoded path Change-Id: Ica171199d95b8b6310cc6c28876ec33b2b53258b Signed-off-by: Hwankyu Jhun --- include/common.h | 2 +- include/defs.h | 4 +- src/common.c | 101 +++++++++++++++++++++++--------------------------- src/debug-launchpad.c | 25 +++++++------ src/debug_util.c | 29 +++++++-------- 5 files changed, 76 insertions(+), 85 deletions(-) diff --git a/include/common.h b/include/common.h index cff6fa6..fa7e9b4 100644 --- a/include/common.h +++ b/include/common.h @@ -70,6 +70,6 @@ void _modify_bundle(bundle *kb, int caller_pid, appinfo_t *appinfo, int cmd); void _set_env(appinfo_t *app_info, bundle *kb); char **_create_argc_argv(bundle *kb, int *margc, const char *app_path); -char *_proc_get_cmdline_bypid(int pid); +int _proc_check_cmdline_bypid(int pid); #endif /* __COMMON_H__ */ diff --git a/include/defs.h b/include/defs.h index 8e48b21..9af5393 100644 --- a/include/defs.h +++ b/include/defs.h @@ -45,9 +45,9 @@ #define DLP_K_UNIT_TEST_ARG "__DLP_UNIT_TEST_ARG__" #define DLP_K_VALGRIND_ARG "__DLP_VALGRIND_ARG__" #define DLP_K_ATTACH_ARG "__DLP_ATTACH_ARG__" +#define DLP_K_GDBSERVER_PATH "__DLP_GDBSERVER_PATH__" +#define DLP_K_VALGRIND_PATH "__DLP_VALGRIND_PATH__" -#define PATH_GDBSERVER "/home/developer/sdk_tools/gdbserver/gdbserver" -#define PATH_VALGRIND "/home/developer/sdk_tools/valgrind/usr/bin/valgrind" #define PATH_DA_SO "/home/developer/sdk_tools/da/da_probe.so" #define OPT_VALGRIND_LOGFILE_FIXED "--log-file=/tmp/valgrind_result.txt" diff --git a/src/common.c b/src/common.c index 5cb31e1..4b05749 100644 --- a/src/common.c +++ b/src/common.c @@ -38,16 +38,6 @@ #include "defs.h" #define MAX_PATH_LEN 1024 -#define BINSH_NAME "/bin/sh" -#define BINSH_SIZE 7 -#define VALGRIND_NAME "/home/developer/sdk_tools/valgrind/usr/bin/valgrind" -#define VALGRIND_SIZE 51 -#define BASH_NAME "/bin/bash" -#define BASH_SIZE 9 -#define OPROFILE_NAME "/usr/bin/oprofile_command" -#define OPROFILE_SIZE 25 -#define OPTION_VALGRIND_NAME "valgrind" -#define OPTION_VALGRIND_SIZE 8 #define MAX_CMD_BUFSZ 1024 #define PATH_TMP "/tmp" #define PATH_DATA "/data" @@ -515,7 +505,7 @@ void _set_env(appinfo_t *appinfo, bundle *kb) __set_sdk_env(appinfo->appid, str_array[i]); } -static char **__add_arg(bundle * kb, char **argv, int *margc, const char *key) +static char **__add_arg(bundle *kb, char **argv, int *margc, const char *key) { const char *str = NULL; const char **str_array = NULL; @@ -523,9 +513,9 @@ static char **__add_arg(bundle * kb, char **argv, int *margc, const char *key) int i; char **new_argv = NULL; - if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) + if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) { str_array = bundle_get_str_array(kb, key, &len); - else { + } else { str = bundle_get_val(kb, key); if (str) { str_array = &str; @@ -535,7 +525,7 @@ static char **__add_arg(bundle * kb, char **argv, int *margc, const char *key) if (str_array) { if (strncmp(key, DLP_K_DEBUG_ARG, strlen(key)) == 0 - || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) { + || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) { new_argv = (char **)realloc(argv, sizeof(char *) * (*margc + len + 2)); if (new_argv == NULL) { @@ -579,7 +569,7 @@ static char **__add_arg(bundle * kb, char **argv, int *margc, const char *key) *margc += len; } else { if (strncmp(key, DLP_K_DEBUG_ARG, strlen(key)) == 0 - || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) { + || strncmp(key, DLP_K_VALGRIND_ARG, strlen(key)) == 0) { new_argv = (char **)realloc(argv, sizeof(char *) * (*margc + 2)); if (new_argv == NULL) { @@ -611,18 +601,19 @@ char **_create_argc_argv(bundle *kb, int *margc, const char *app_path) const char *str; const char **str_array = NULL; int len = 0; + const char *path; argc = bundle_export_to_argv(kb, &argv); - if (argv) + if (argv) { argv[0] = strdup(app_path); - else { + } else { _E("bundle_export_to_argv() is failed."); return NULL; } - if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) + if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) { str_array = bundle_get_str_array(kb, AUL_K_SDK, &len); - else { + } else { str = bundle_get_val(kb, AUL_K_SDK); if (str) { str_array = &str; @@ -645,19 +636,46 @@ char **_create_argc_argv(bundle *kb, int *margc, const char *app_path) else argv[0] = strdup(buf); + path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH); + if (path == NULL) { + _E("Failed to get gdbserver path"); + if (argv[0]) + free(argv[0]); + bundle_free_exported_argv(argc, &argv); + *margc = 0; + return NULL; + } new_argv = __add_arg(kb, argv, &argc, DLP_K_DEBUG_ARG); - new_argv[0] = strdup(PATH_GDBSERVER); + new_argv[0] = strdup(path); argv = new_argv; } else if (strncmp(str_array[i], SDK_VALGRIND, strlen(str_array[i])) == 0) { + path = bundle_get_val(kb, DLP_K_VALGRIND_PATH); + if (path == NULL) { + _E("Failed to get valgrind path"); + if (argv[0]) + free(argv[0]); + bundle_free_exported_argv(argc, &argv); + *margc = 0; + return NULL; + } new_argv = __add_arg(kb, argv, &argc, DLP_K_VALGRIND_ARG); - new_argv[0] = strdup(PATH_VALGRIND); + new_argv[0] = strdup(path); argv = new_argv; } else if (strncmp(str_array[i], SDK_UNIT_TEST, strlen(str_array[i])) == 0) { new_argv = __add_arg(kb, argv, &argc, DLP_K_UNIT_TEST_ARG); argv = new_argv; } else if (strncmp(str_array[i], SDK_ATTACH, strlen(str_array[i])) == 0) { + path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH); + if (path == NULL) { + _E("Failed to get gdbserver path"); + if (argv[0]) + free(argv[0]); + bundle_free_exported_argv(argc, &argv); + *margc = 0; + return NULL; + } new_argv = __add_arg(kb, argv, &argc, DLP_K_ATTACH_ARG); - new_argv[0] = strdup(PATH_GDBSERVER); + new_argv[0] = strdup(path); argv = new_argv; } @@ -684,53 +702,26 @@ static int __read_proc(const char *path, char *buf, int size) if (ret <= 0) { close(fd); return -1; - } else + } else { buf[ret] = 0; + } close(fd); return ret; } -char *_proc_get_cmdline_bypid(int pid) +int _proc_check_cmdline_bypid(int pid) { char buf[MAX_CMD_BUFSZ]; int ret; - char* ptr = NULL; snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); ret = __read_proc(buf, buf, sizeof(buf)); if (ret <= 0) - return NULL; - - /* support app launched by shell script*/ - if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0) - return strdup(&buf[BINSH_SIZE + 1]); - else if (strncmp(buf, VALGRIND_NAME, VALGRIND_SIZE) == 0) { - /* buf comes with double null-terminated string */ - while (1) { - while (*ptr) - ptr++; - ptr++; - - if (!(*ptr)) - break; - - /* ignore trailing "--" */ - if (strncmp(ptr, "-", 1) != 0) - break; - } + return -1; - return strdup(ptr); - } else if (strncmp(buf, BASH_NAME, BASH_SIZE) == 0) { - if (strncmp(&buf[BASH_SIZE + 1], OPROFILE_NAME, OPROFILE_SIZE) == 0) { - if (strncmp(&buf[BASH_SIZE + OPROFILE_SIZE + 2], - OPTION_VALGRIND_NAME, OPTION_VALGRIND_SIZE) == 0) { - return strdup(&buf[BASH_SIZE + OPROFILE_SIZE + - OPTION_VALGRIND_SIZE + 3]); - } - } - } + _D("cmdline: %s", buf); - return strdup(buf); + return 0; } diff --git a/src/debug-launchpad.c b/src/debug-launchpad.c index c9c4cc4..10cc305 100644 --- a/src/debug-launchpad.c +++ b/src/debug-launchpad.c @@ -61,9 +61,9 @@ static int __real_send(int clifd, int ret) return 0; } -static void __send_result_to_caller(int clifd, int ret, const char* app_path) +static void __send_result_to_caller(int clifd, int ret) { - char *cmdline; + int res; _W("Check app launching"); @@ -76,8 +76,8 @@ static void __send_result_to_caller(int clifd, int ret, const char* app_path) return; } - cmdline = _proc_get_cmdline_bypid(ret); - if (cmdline == NULL) { + res = _proc_check_cmdline_bypid(ret); + if (res < 0) { _E("The app process might be terminated while we are wating %d", ret); __real_send(clifd, -1); /* abnormally launched */ return; @@ -141,13 +141,15 @@ static int __prepare_exec(const char *appid, const char *app_path, static int __prepare_fork(bundle *kb, const char *appid) { - const char *str = NULL; + const char *str; const char **str_array = NULL; int len = 0; - if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) + if (bundle_get_type(kb, AUL_K_SDK) & BUNDLE_TYPE_ARRAY) { str_array = bundle_get_str_array(kb, AUL_K_SDK, &len); - else { + if (str_array == NULL) + return -1; + } else { str = bundle_get_val(kb, AUL_K_SDK); if (str) { str_array = &str; @@ -236,14 +238,14 @@ static void __real_launch(const char *app_path, bundle *kb) int i; app_argv = _create_argc_argv(kb, &app_argc, app_path); + if (app_argv == NULL) + return; + for (i = 0; i < app_argc; i++) _D("input argument %d : %s##", i, app_argv[i]); PERF("setup argument done"); - /* Temporary log: launch time checking */ - LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:launchpad:done]", app_path); - __normal_fork_exec(app_argc, app_argv); } @@ -380,7 +382,7 @@ static gboolean __handle_launch_event(gpointer data) pid = __start_process(appinfo->appid, app_path, kb, appinfo); end: - __send_result_to_caller(clifd, pid, app_path); + __send_result_to_caller(clifd, pid); if (pid > 0) _send_app_launch_signal(pid, appinfo->appid); @@ -539,3 +541,4 @@ int main(int argc, char **argv) return 0; } + diff --git a/src/debug_util.c b/src/debug_util.c index 5e9074e..ab18d35 100644 --- a/src/debug_util.c +++ b/src/debug_util.c @@ -66,7 +66,7 @@ static int __check_pkginfo(const char *appid) char *storeclientid = NULL; pkgmgrinfo_pkginfo_h handle; - r = pkgmgrinfo_pkginfo_get_pkginfo(appid, &handle); + r = pkgmgrinfo_pkginfo_get_usr_pkginfo(appid, getuid(), &handle); if (r != PMINFO_R_OK) { _E("Failed to get pkginfo: %s", appid); return -1; @@ -101,29 +101,24 @@ static int __check_pkginfo(const char *appid) return 0; } -static int __prepare_gdbserver(const char *appid) +static int __prepare_gdbserver(bundle *kb, const char *appid) { int r; + const char *path; r = __check_pkginfo(appid); if (r < 0) return -1; - if (_apply_smack_rules(LABEL_SDBD, appid, "w")) - _E("Failed to apply smack rule %s %s w", LABEL_SDBD, appid); - - /* fixed debug-as fail issue (grant permission to use 10.0.2.2, 10.0.2.16) */ - if (_apply_smack_rules(appid, LABEL_NETWORK, "rw")) - _E("Failed to apply smack rule %s %s rw", appid, LABEL_NETWORK); - - if (_apply_smack_rules(LABEL_NETWORK, appid, "w")) - _E("Failed to apply smack rule %s %s w", LABEL_NETWORK, appid); + path = bundle_get_val(kb, DLP_K_GDBSERVER_PATH); + if (path == NULL) + return -1; - r = dlp_chmod(PATH_GDBSERVER, S_IRUSR | S_IWUSR + r = dlp_chmod(path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH, 1); if (r != 0) - _W("Failed to set 755: %s", PATH_GDBSERVER); + _W("Failed to set 755: %s", path); gdbserver = true; @@ -137,9 +132,11 @@ static int __prepare_valgrind(bundle *kb) int len = 0; int i; - if (bundle_get_type(kb, DLP_K_VALGRIND_ARG) & BUNDLE_TYPE_ARRAY) + if (bundle_get_type(kb, DLP_K_VALGRIND_ARG) & BUNDLE_TYPE_ARRAY) { str_arr = bundle_get_str_array(kb, DLP_K_VALGRIND_ARG, &len); - else { + if (str_arr == NULL) + return -1; + } else { str = bundle_get_val(kb, DLP_K_VALGRIND_ARG); if (str) { str_arr = &str; @@ -200,7 +197,7 @@ int _prepare_debug_tool(bundle *kb, const char *appid, if (strncmp(str_arr[i], SDK_DEBUG, strlen(SDK_DEBUG)) == 0 || strncmp(str_arr[i], SDK_ATTACH, strlen(SDK_ATTACH)) == 0) { - if (__prepare_gdbserver(appid) < 0) + if (__prepare_gdbserver(kb, appid) < 0) return -1; } else if (strncmp(str_arr[i], SDK_VALGRIND, strlen(SDK_VALGRIND)) == 0) { __prepare_valgrind(kb); -- 2.7.4