mirror of
https://github.com/clearml/dropbear
synced 2025-01-31 10:57:01 +00:00
check for fork() and not __uClinux__
This commit is contained in:
parent
33ae2be52e
commit
c957edbe75
@ -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))
|
||||
|
||||
|
2
dbutil.c
2
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();
|
||||
|
59
scp.c
59
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]);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user