From c957edbe759ba8d708a882dcb9ab3b2aa1a72ad1 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sun, 8 Apr 2012 01:50:52 -0400 Subject: [PATCH] check for fork() and not __uClinux__ --- configure.in | 2 +- dbutil.c | 2 +- scp.c | 59 ++++++++++++++++++++++++----------------------- session.h | 2 +- svr-chansession.c | 12 +++++----- svr-session.c | 4 ++-- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/configure.in b/configure.in index 6272a15..3b82bb7 100644 --- a/configure.in +++ b/configure.in @@ -616,7 +616,7 @@ AC_PROG_GCC_TRADITIONAL AC_FUNC_MEMCMP AC_FUNC_SELECT_ARGTYPES AC_TYPE_SIGNAL -AC_CHECK_FUNCS([dup2 getspnam getusershell memset putenv select socket strdup clearenv strlcpy strlcat daemon basename _getpty getaddrinfo freeaddrinfo getnameinfo]) +AC_CHECK_FUNCS([dup2 getspnam getusershell memset putenv select socket strdup clearenv strlcpy strlcat daemon basename _getpty getaddrinfo freeaddrinfo getnameinfo fork]) AC_SEARCH_LIBS(basename, gen, AC_DEFINE(HAVE_BASENAME)) diff --git a/dbutil.c b/dbutil.c index 9a6d846..97d7277 100644 --- a/dbutil.c +++ b/dbutil.c @@ -443,7 +443,7 @@ int spawn_command(void(*exec_fn)(void *user_data), void *exec_data, return DROPBEAR_FAILURE; } -#ifdef __uClinux__ +#ifndef HAVE_FORK pid = vfork(); #else pid = fork(); diff --git a/scp.c b/scp.c index 961165a..6911ca2 100644 --- a/scp.c +++ b/scp.c @@ -130,22 +130,22 @@ do_local_cmd(arglist *a) fprintf(stderr, " %s", a->list[i]); fprintf(stderr, "\n"); } -#ifdef __uClinux__ +#ifndef HAVE_FORK pid = vfork(); #else pid = fork(); -#endif /* __uClinux__ */ +#endif if (pid == -1) fatal("do_local_cmd: fork: %s", strerror(errno)); if (pid == 0) { execvp(a->list[0], a->list); perror(a->list[0]); -#ifdef __uClinux__ +#ifndef HAVE_FORK _exit(1); #else exit(1); -#endif /* __uClinux__ */ +#endif } do_cmd_pid = pid; @@ -171,6 +171,16 @@ do_local_cmd(arglist *a) * assigns the input and output file descriptors on success. */ +static void +arg_setup(char *host, char *remuser, char *cmd) +{ + replacearg(&args, 0, "%s", ssh_program); + if (remuser != NULL) + addargs(&args, "-l%s", remuser); + addargs(&args, "%s", host); + addargs(&args, "%s", cmd); +} + int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) { @@ -198,22 +208,18 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) close(reserved[0]); close(reserved[1]); - /* uClinux needs to build the args here before vforking, - otherwise we do it later on. */ -#ifdef __uClinux__ - replacearg(&args, 0, "%s", ssh_program); - if (remuser != NULL) - addargs(&args, "-l%s", remuser); - addargs(&args, "%s", host); - addargs(&args, "%s", cmd); -#endif /* __uClinux__ */ + /* uClinux needs to build the args here before vforking, + otherwise we do it later on. */ +#ifndef HAVE_FORK + arg_setup(host, remuser, cmd); +#endif /* Fork a child to execute the command on the remote host using ssh. */ -#ifdef __uClinux__ +#ifndef HAVE_FORK do_cmd_pid = vfork(); #else do_cmd_pid = fork(); -#endif /* __uClinux__ */ +#endif if (do_cmd_pid == 0) { /* Child. */ @@ -224,27 +230,22 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) close(pin[0]); close(pout[1]); -#ifndef __uClinux__ - replacearg(&args, 0, "%s", ssh_program); - if (remuser != NULL) - addargs(&args, "-l%s", remuser); - addargs(&args, "%s", host); - addargs(&args, "%s", cmd); -#endif /* __uClinux__ */ +#ifndef HAVE_FORK + arg_setup(host, remuser, cmd); +#endif execvp(ssh_program, args.list); perror(ssh_program); -#ifndef __uClinux__ - exit(1); -#else +#ifndef HAVE_FORK _exit(1); -#endif /* __uClinux__ */ +#else + exit(1); +#endif } else if (do_cmd_pid == -1) { fatal("fork: %s", strerror(errno)); } - -#ifdef __uClinux__ +#ifndef HAVE_FORK /* clean up command */ /* pop cmd */ xfree(args.list[args.num-1]); @@ -260,7 +261,7 @@ do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc) args.list[args.num-1]=NULL; args.num--; } -#endif /* __uClinux__ */ +#endif /* Parent. Close the other side, and return the local side. */ close(pin[0]); diff --git a/session.h b/session.h index 09b3de5..ea59bca 100644 --- a/session.h +++ b/session.h @@ -218,7 +218,7 @@ struct serversession { /* The resolved remote address, used for lastlog etc */ char *remotehost; -#ifdef __uClinux__ +#ifndef HAVE_FORK pid_t server_pid; #endif diff --git a/svr-chansession.c b/svr-chansession.c index 9fd49c1..198dbe6 100644 --- a/svr-chansession.c +++ b/svr-chansession.c @@ -658,7 +658,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess, /* uClinux will vfork(), so there'll be a race as connection_string is freed below. */ -#ifndef __uClinux__ +#ifdef HAVE_FORK chansess->connection_string = make_connection_string(); #endif @@ -670,7 +670,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess, ret = ptycommand(channel, chansess); } -#ifndef __uClinux__ +#ifdef HAVE_FORK m_free(chansess->connection_string); #endif @@ -745,7 +745,7 @@ static int ptycommand(struct Channel *channel, struct ChanSess *chansess) { return DROPBEAR_FAILURE; } -#ifdef __uClinux__ +#ifndef HAVE_FORK pid = vfork(); #else pid = fork(); @@ -863,9 +863,9 @@ static void execchild(void *user_data) { struct ChanSess *chansess = user_data; char *usershell = NULL; - /* with uClinux we'll have vfork()ed, so don't want to overwrite the - * hostkey. can't think of a workaround to clear it */ -#ifndef __uClinux__ + /* with uClinux we'll have vfork()ed, so don't want to overwrite the + * hostkey. can't think of a workaround to clear it */ +#ifdef HAVE_FORK /* wipe the hostkey */ sign_key_free(svr_opts.hostkey); svr_opts.hostkey = NULL; diff --git a/svr-session.c b/svr-session.c index 77d167b..7703a8f 100644 --- a/svr-session.c +++ b/svr-session.c @@ -84,7 +84,7 @@ void svr_session(int sock, int childpipe) { /* Initialise server specific parts of the session */ svr_ses.childpipe = childpipe; -#ifdef __uClinux__ +#ifndef HAVE_FORK svr_ses.server_pid = getpid(); #endif svr_authinitialise(); @@ -157,7 +157,7 @@ void svr_dropbear_exit(int exitcode, const char* format, va_list param) { _dropbear_log(LOG_INFO, fmtbuf, param); -#ifdef __uClinux__ +#ifndef HAVE_FORK /* only the main server process should cleanup - we don't want * forked children doing that */ if (svr_ses.server_pid == getpid())