util: Fix spawn API to work properly on 64-bit architectures 49/200749/2
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Fri, 1 Mar 2019 15:13:58 +0000 (16:13 +0100)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Fri, 1 Mar 2019 16:24:31 +0000 (17:24 +0100)
Introducing spawn_param_u has the purpose of avoiding
casting arch-dependent pointers to various data types.

Change-Id: I81c4c292ac9f0d9506f3ad3cac1676e9c99cc090

src/crash-manager/crash-manager.c
src/dump_systemstate/dump_systemstate.c
src/log_dump/log_dump.c
src/shared/spawn.c
src/shared/spawn.h

index 9f08d4b..9d3bec5 100644 (file)
@@ -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, &param, 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, &param, ZIP_TIMEOUT_MS, NULL);
 
        if ((lock_fd = lock_dumpdir()) < 0)
                return;
index 451a7ad..2d2c5b5 100644 (file)
@@ -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, &param, DEFAULT_COMMAND_TIMEOUT_MS, &err) || err != 0) { \
                        exit_code |= EXIT_CMDERR; \
                        fprintf_fd(out_fd, "\nCommand failed with error code: %d", err); \
                } \
index 566c257..cfec34c 100644 (file)
@@ -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, &param, 0, exit_code);
 
        _I("Storing report at %s", archive_path);
 
index 130dccd..84d2db9 100644 (file)
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 
+#include <assert.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
 
 /* 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;
        }
index d511185..7aa5f52 100644 (file)
@@ -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
 }