diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/asshelp.c | 5 | ||||
-rw-r--r-- | common/exechelp-posix.c | 43 | ||||
-rw-r--r-- | common/exechelp-w32.c | 48 |
3 files changed, 42 insertions, 54 deletions
diff --git a/common/asshelp.c b/common/asshelp.c index 41ba1796f..2053c55e6 100644 --- a/common/asshelp.c +++ b/common/asshelp.c @@ -524,10 +524,7 @@ start_new_service (assuan_context_t *r_ctx, { #ifdef HAVE_W32_SYSTEM err = gnupg_process_spawn (program? program : program_name, argv, - (GNUPG_PROCESS_DETACHED - |GNUPG_PROCESS_STDIN_NULL - |GNUPG_PROCESS_STDOUT_NULL - |GNUPG_PROCESS_STDERR_NULL), + GNUPG_PROCESS_DETACHED, NULL, NULL, NULL); #else /*!W32*/ err = gnupg_process_spawn (program? program : program_name, argv, diff --git a/common/exechelp-posix.c b/common/exechelp-posix.c index af79aab3e..363936068 100644 --- a/common/exechelp-posix.c +++ b/common/exechelp-posix.c @@ -1034,8 +1034,7 @@ my_exec (const char *pgmname, const char *argv[], struct spawn_cb_arg *sca) } static gpg_err_code_t -spawn_detached (gnupg_process_t process, - const char *pgmname, const char *argv[], +spawn_detached (const char *pgmname, const char *argv[], void (*spawn_cb) (struct spawn_cb_arg *), void *spawn_cb_arg) { gpg_err_code_t ec; @@ -1044,7 +1043,6 @@ spawn_detached (gnupg_process_t process, /* FIXME: Is this GnuPG specific or should we keep it. */ if (getuid() != geteuid()) { - xfree (process); xfree (argv); return GPG_ERR_BUG; } @@ -1052,7 +1050,6 @@ spawn_detached (gnupg_process_t process, if (access (pgmname, X_OK)) { ec = gpg_err_code_from_syserror (); - xfree (process); xfree (argv); return ec; } @@ -1064,7 +1061,6 @@ spawn_detached (gnupg_process_t process, { ec = gpg_err_code_from_syserror (); log_error (_("error forking process: %s\n"), gpg_strerror (ec)); - xfree (process); xfree (argv); return ec; } @@ -1101,12 +1097,6 @@ spawn_detached (gnupg_process_t process, else post_syscall (); - process->pid = (pid_t)-1; - process->fd_in = -1; - process->fd_out = -1; - process->fd_err = -1; - process->wstatus = -1; - process->terminated = 1; return 0; } @@ -1156,29 +1146,34 @@ gnupg_process_spawn (const char *pgmname, const char *argv1[], for (i=0, j=1; argv1[i]; i++, j++) argv[j] = argv1[i]; - process = xtrycalloc (1, sizeof (struct gnupg_process)); - if (process == NULL) - { - xfree (argv); - return gpg_err_code_from_syserror (); - } - - process->pgmname = pgmname; - process->flags = flags; - if ((flags & GNUPG_PROCESS_DETACHED)) { if ((flags & GNUPG_PROCESS_STDFDS_SETTING)) { - xfree (process); xfree (argv); return GPG_ERR_INV_FLAG; } - *r_process = process; - return spawn_detached (process, pgmname, argv, spawn_cb, spawn_cb_arg); + /* In detached case, it must be no R_PROCESS. */ + if (r_process) + { + xfree (argv); + return GPG_ERR_INV_ARG; + } + + return spawn_detached (pgmname, argv, spawn_cb, spawn_cb_arg); + } + + process = xtrycalloc (1, sizeof (struct gnupg_process)); + if (process == NULL) + { + xfree (argv); + return gpg_err_code_from_syserror (); } + process->pgmname = pgmname; + process->flags = flags; + if ((flags & GNUPG_PROCESS_STDINOUT_SOCKETPAIR)) { ec = do_create_socketpair (fd_in); diff --git a/common/exechelp-w32.c b/common/exechelp-w32.c index dfbb3a155..48aa98487 100644 --- a/common/exechelp-w32.c +++ b/common/exechelp-w32.c @@ -1096,8 +1096,7 @@ post_syscall (void) static gpg_err_code_t -spawn_detached (gnupg_process_t process, - const char *pgmname, char *cmdline, +spawn_detached (const char *pgmname, char *cmdline, void (*spawn_cb) (struct spawn_cb_arg *), void *spawn_cb_arg) { SECURITY_ATTRIBUTES sec_attr; @@ -1113,7 +1112,6 @@ spawn_detached (gnupg_process_t process, ec = gnupg_access (pgmname, X_OK); if (ec) { - xfree (process); xfree (cmdline); return ec; } @@ -1191,13 +1189,6 @@ spawn_detached (gnupg_process_t process, CloseHandle (pi.hThread); CloseHandle (pi.hProcess); - - process->hProcess = INVALID_HANDLE_VALUE; - process->hd_in = INVALID_HANDLE_VALUE; - process->hd_out = INVALID_HANDLE_VALUE; - process->hd_err = INVALID_HANDLE_VALUE; - process->exitcode = -1; - process->terminated = 1; return 0; } @@ -1238,37 +1229,42 @@ gnupg_process_spawn (const char *pgmname, const char *argv[], check_syscall_func (); - if (r_process) - *r_process = NULL; - /* Build the command line. */ ec = build_w32_commandline (pgmname, argv, &cmdline); if (ec) return ec; - process = xtrymalloc (sizeof (struct gnupg_process)); - if (process == NULL) - { - xfree (cmdline); - return gpg_err_code_from_syserror (); - } - - process->pgmname = pgmname; - process->flags = flags; - if ((flags & GNUPG_PROCESS_DETACHED)) { if ((flags & GNUPG_PROCESS_STDFDS_SETTING)) { - xfree (process); xfree (cmdline); return GPG_ERR_INV_FLAG; } - *r_process = process; - return spawn_detached (process, pgmname, cmdline, spawn_cb, spawn_cb_arg); + /* In detached case, it must be no R_PROCESS. */ + if (r_process) + { + xfree (cmdline); + return GPG_ERR_INV_ARG; + } + + return spawn_detached (pgmname, cmdline, spawn_cb, spawn_cb_arg); } + if (r_process) + *r_process = NULL; + + process = xtrymalloc (sizeof (struct gnupg_process)); + if (process == NULL) + { + xfree (cmdline); + return gpg_err_code_from_syserror (); + } + + process->pgmname = pgmname; + process->flags = flags; + if ((flags & GNUPG_PROCESS_STDINOUT_SOCKETPAIR)) { xfree (process); |