From: Karol Lewandowski Date: Fri, 1 Mar 2019 15:13:58 +0000 (+0100) Subject: util: Fix spawn API to work properly on 64-bit architectures X-Git-Tag: submit/tizen/20190301.163056~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=975b958a0aebc4a9c9dde07d3bb3f03d337a6f60;p=platform%2Fcore%2Fsystem%2Fcrash-worker.git util: Fix spawn API to work properly on 64-bit architectures Introducing spawn_param_u has the purpose of avoiding casting arch-dependent pointers to various data types. Change-Id: I81c4c292ac9f0d9506f3ad3cac1676e9c99cc090 --- diff --git a/src/crash-manager/crash-manager.c b/src/crash-manager/crash-manager.c index 9f08d4b..9d3bec5 100644 --- a/src/crash-manager/crash-manager.c +++ b/src/crash-manager/crash-manager.c @@ -830,7 +830,8 @@ static bool execute_crash_stack(const struct crash_info *cinfo, int *exit_code) return false; } - is_ok = spawn_wait(args, NULL, spawn_setstdout, (void *)fd, CRASH_STACK_TIMEOUT_MS, exit_code); + spawn_param_u param = { .int_val = fd }; + is_ok = spawn_wait(args, NULL, spawn_setstdout, ¶m, CRASH_STACK_TIMEOUT_MS, exit_code); close(fd); out: @@ -1115,7 +1116,8 @@ static void compress(struct crash_info *cinfo) NULL }; - (void)spawn_wait(args, NULL, spawn_chdir, (void *)cinfo->temp_dir, ZIP_TIMEOUT_MS, NULL); + spawn_param_u param = { .char_ptr = cinfo->temp_dir }; + (void)spawn_wait(args, NULL, spawn_chdir, ¶m, ZIP_TIMEOUT_MS, NULL); if ((lock_fd = lock_dumpdir()) < 0) return; diff --git a/src/dump_systemstate/dump_systemstate.c b/src/dump_systemstate/dump_systemstate.c index 451a7ad..2d2c5b5 100644 --- a/src/dump_systemstate/dump_systemstate.c +++ b/src/dump_systemstate/dump_systemstate.c @@ -163,7 +163,8 @@ int main(int argc, char *argv[]) #define spawn_wait_checked(av, env) \ do { \ int err; \ - if (!spawn_wait(av, env, spawn_setstdout, (void *)out_fd, DEFAULT_COMMAND_TIMEOUT_MS, &err) || err != 0) { \ + spawn_param_u param = { .int_val = out_fd }; \ + if (!spawn_wait(av, env, spawn_setstdout, ¶m, DEFAULT_COMMAND_TIMEOUT_MS, &err) || err != 0) { \ exit_code |= EXIT_CMDERR; \ fprintf_fd(out_fd, "\nCommand failed with error code: %d", err); \ } \ diff --git a/src/log_dump/log_dump.c b/src/log_dump/log_dump.c index 566c257..cfec34c 100644 --- a/src/log_dump/log_dump.c +++ b/src/log_dump/log_dump.c @@ -218,7 +218,8 @@ static bool compress(char *const destdir, char *const tempdir, char *const versi _D("compress tempdir is %s", tempdir); char *av[] = {"/bin/zip", "-yr", archive_path, ".", NULL}; - bool is_ok = spawn_wait(av, NULL, spawn_chdir, (void*)tempdir, 0, exit_code); + spawn_param_u param = { .char_ptr = tempdir }; + bool is_ok = spawn_wait(av, NULL, spawn_chdir, ¶m, 0, exit_code); _I("Storing report at %s", archive_path); diff --git a/src/shared/spawn.c b/src/shared/spawn.c index 130dccd..84d2db9 100644 --- a/src/shared/spawn.c +++ b/src/shared/spawn.c @@ -15,6 +15,7 @@ * limitations under the License. */ +#include #include #include #include @@ -35,26 +36,28 @@ /* spawn prepare function(s) - to be called in child process */ -int spawn_setstdout(void *userdata) +int spawn_setstdout(spawn_param_u *param) { - int fd = (int)userdata; - return dup2(fd, STDOUT_FILENO) < 0 ? -1 : 0; + assert(param); + return dup2(param->int_val, STDOUT_FILENO) < 0 ? -1 : 0; } -int spawn_setstdouterr(void *userdata) +int spawn_setstdouterr(spawn_param_u *param) { - int fd = (int)userdata; - return dup2(fd, STDOUT_FILENO) < 0 || dup2(fd, STDERR_FILENO) < 0 ? -1 : 0; + assert(param); + return dup2(param->int_val, STDOUT_FILENO) < 0 || dup2(param->int_val, STDERR_FILENO) < 0 ? -1 : 0; } -int spawn_chdir(void *userdata) +int spawn_chdir(spawn_param_u *param) { - return chdir((char *)userdata); + assert(param); + return chdir(param->char_ptr); } -int spawn_umask(void *userdata) +int spawn_umask(spawn_param_u *param) { - (void)umask((mode_t)userdata); + assert(param); + (void)umask(param->mode_t_val); return 0; } @@ -94,11 +97,11 @@ bool wait_for_pid(pid_t pid, int *exit_code) return true; } -static int spawn_child(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prepdata) +static int spawn_child(char *const av[], char *const ev[], spawn_prepare_fn prep, spawn_param_u *param) { static const int spawn_error = 127; - int r = prep ? prep(prepdata) : 0; + int r = prep ? prep(param) : 0; if (r < 0) return spawn_error; @@ -106,7 +109,7 @@ static int spawn_child(char *const av[], char *const ev[], spawn_prepare_fn prep return spawn_error; } -bool spawn(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prepdata, pid_t *childpid, int *childfd) +bool spawn(char *const av[], char *const ev[], spawn_prepare_fn prep, spawn_param_u *param, pid_t *childpid, int *childfd) { int pipefd[2]; if (pipe(pipefd) < 0) { @@ -122,7 +125,7 @@ bool spawn(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prep return false; } else if (pid == 0) { close(pipefd[0]); - _exit(spawn_child(av, ev, prep, prepdata)); + _exit(spawn_child(av, ev, prep, param)); } close(pipefd[1]); @@ -168,12 +171,12 @@ static bool wait_and_kill(pid_t childpid, int childfd, int timeout_ms) return true; } -bool spawn_wait(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prepdata, int timeout_ms, int *exit_code) +bool spawn_wait(char *const av[], char *const ev[], spawn_prepare_fn prep, spawn_param_u *param, int timeout_ms, int *exit_code) { pid_t childpid; int childfd; - if (!spawn(av, ev, prep, prepdata, &childpid, &childfd)) { + if (!spawn(av, ev, prep, param, &childpid, &childfd)) { _E("spawn() returned an error - aborting waiting"); return false; } diff --git a/src/shared/spawn.h b/src/shared/spawn.h index d511185..7aa5f52 100644 --- a/src/shared/spawn.h +++ b/src/shared/spawn.h @@ -23,16 +23,22 @@ extern "C" { #define DEFAULT_COMMAND_TIMEOUT_MS (60*1000) /* 60sec */ -typedef int (*spawn_prepare_fn)(void *); +typedef union { + int int_val; + mode_t mode_t_val; + char *char_ptr; +} spawn_param_u; -int spawn_setstdout(void *userdata); -int spawn_setstdouterr(void *userdata); -int spawn_chdir(void *userdata); -int spawn_umask(void *userdata); +typedef int (*spawn_prepare_fn)(spawn_param_u *param); + +int spawn_setstdout(spawn_param_u *param); +int spawn_setstdouterr(spawn_param_u *param); +int spawn_chdir(spawn_param_u *param); +int spawn_umask(spawn_param_u *param); bool wait_for_pid(pid_t pid, int *exit_code); -bool spawn(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prepdata, pid_t *childpid, int *childfd); -bool spawn_wait(char *const av[], char *const ev[], spawn_prepare_fn prep, void *prepdata, int timeout_ms, int *exit_code); +bool spawn(char *const av[], char *const ev[], spawn_prepare_fn prep, spawn_param_u *param, pid_t *childpid, int *childfd); +bool spawn_wait(char *const av[], char *const ev[], spawn_prepare_fn prep, spawn_param_u *param, int timeout_ms, int *exit_code); #ifdef __cplusplus }