mirror of
https://github.com/clearml/dropbear
synced 2025-02-07 13:21:15 +00:00
Fix missing NULL terminator for re-exec
Also fixes fallback, sockets were not kept open
This commit is contained in:
parent
3fb2406717
commit
e93b03cb00
13
svr-main.c
13
svr-main.c
@ -339,20 +339,25 @@ static void main_noinetd(int argc, char ** argv) {
|
|||||||
if (execfd >= 0) {
|
if (execfd >= 0) {
|
||||||
#if DROPBEAR_DO_REEXEC
|
#if DROPBEAR_DO_REEXEC
|
||||||
/* Add "-2" to the args and re-execute ourself */
|
/* Add "-2" to the args and re-execute ourself */
|
||||||
char **new_argv = m_malloc(sizeof(char*) * (argc+1));
|
char **new_argv = m_malloc(sizeof(char*) * (argc+2));
|
||||||
memcpy(new_argv, argv, sizeof(char*) * argc);
|
memcpy(new_argv, argv, sizeof(char*) * argc);
|
||||||
new_argv[argc] = "-2";
|
new_argv[argc] = "-2";
|
||||||
|
new_argv[argc+1] = NULL;
|
||||||
|
|
||||||
if ((dup2(childsock, STDIN_FILENO) < 0)) {
|
if ((dup2(childsock, STDIN_FILENO) < 0)) {
|
||||||
dropbear_exit("dup2 failed: %s", strerror(errno));
|
dropbear_exit("dup2 failed: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
m_close(childsock);
|
if (fcntl(childsock, F_SETFD, FD_CLOEXEC) < 0) {
|
||||||
|
TRACE(("cloexec for childsock %d failed: %s", childsock, strerror(errno)))
|
||||||
|
}
|
||||||
/* Re-execute ourself */
|
/* Re-execute ourself */
|
||||||
fexecve(execfd, new_argv, environ);
|
fexecve(execfd, new_argv, environ);
|
||||||
/* Not reached on success */
|
/* Not reached on success */
|
||||||
|
|
||||||
/* Fall back on plain fork otherwise */
|
/* Fall back on plain fork otherwise.
|
||||||
TRACE(("fexecve failed, disabling re-exec: %s", strerror(errno)))
|
* To be removed in future once re-exec has been well tested */
|
||||||
|
dropbear_log(LOG_WARNING, "fexecve failed, disabling re-exec: %s", strerror(errno));
|
||||||
|
m_close(STDIN_FILENO);
|
||||||
m_free(new_argv);
|
m_free(new_argv);
|
||||||
#endif /* DROPBEAR_DO_REEXEC */
|
#endif /* DROPBEAR_DO_REEXEC */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user