summaryrefslogtreecommitdiff
path: root/svr-main.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2022-01-31 11:12:58 +0800
committerMatt Johnston <matt@ucc.asn.au>2022-01-31 11:12:58 +0800
commite93b03cb00f5d034316ab10f8b04893e771d1228 (patch)
tree25e5b4c61cdce86e67cfbb5ce28c6ebeaa7f3e3d /svr-main.c
parent3fb2406717f8a83294083fe9ac6c80d161baf81a (diff)
downloaddropbear-e93b03cb00f5d034316ab10f8b04893e771d1228.tar.gz
Fix missing NULL terminator for re-exec
Also fixes fallback, sockets were not kept open
Diffstat (limited to 'svr-main.c')
-rw-r--r--svr-main.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/svr-main.c b/svr-main.c
index f39f9fc..3595d4c 100644
--- a/svr-main.c
+++ b/svr-main.c
@@ -339,20 +339,25 @@ static void main_noinetd(int argc, char ** argv) {
if (execfd >= 0) {
#if DROPBEAR_DO_REEXEC
/* 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);
new_argv[argc] = "-2";
+ new_argv[argc+1] = NULL;
if ((dup2(childsock, STDIN_FILENO) < 0)) {
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 */
fexecve(execfd, new_argv, environ);
/* Not reached on success */
- /* Fall back on plain fork otherwise */
- TRACE(("fexecve failed, disabling re-exec: %s", strerror(errno)))
+ /* Fall back on plain fork otherwise.
+ * 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);
#endif /* DROPBEAR_DO_REEXEC */
}