e491611316
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
86 lines
2.7 KiB
Diff
86 lines
2.7 KiB
Diff
diff -urpN busybox-1.14.1/networking/telnetd.c busybox-1.14.1-telnetd/networking/telnetd.c
|
|
--- busybox-1.14.1/networking/telnetd.c 2009-05-27 18:00:23.000000000 +0200
|
|
+++ busybox-1.14.1-telnetd/networking/telnetd.c 2009-06-09 22:54:06.000000000 +0200
|
|
@@ -199,9 +199,17 @@ static size_t iac_safe_write(int fd, con
|
|
return total + rc;
|
|
}
|
|
|
|
+/* Must match getopt32 string */
|
|
+enum {
|
|
+ OPT_WATCHCHILD = (1 << 2), /* -K */
|
|
+ OPT_INETD = (1 << 3) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -i */
|
|
+ OPT_PORT = (1 << 4) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -p */
|
|
+ OPT_FOREGROUND = (1 << 6) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -F */
|
|
+};
|
|
+
|
|
static struct tsession *
|
|
make_new_session(
|
|
- USE_FEATURE_TELNETD_STANDALONE(int sock)
|
|
+ USE_FEATURE_TELNETD_STANDALONE(int master_fd, int sock)
|
|
SKIP_FEATURE_TELNETD_STANDALONE(void)
|
|
) {
|
|
const char *login_argv[2];
|
|
@@ -288,9 +296,29 @@ make_new_session(
|
|
/* Restore default signal handling ASAP */
|
|
bb_signals((1 << SIGCHLD) + (1 << SIGPIPE), SIG_DFL);
|
|
|
|
+#if ENABLE_FEATURE_TELNETD_STANDALONE
|
|
+ if (!(option_mask32 & OPT_INETD)) {
|
|
+ struct tsession *tp = sessions;
|
|
+ while (tp) {
|
|
+ close(tp->ptyfd);
|
|
+ close(tp->sockfd_read);
|
|
+ /* sockfd_write == sockfd_read for standalone telnetd */
|
|
+ /*close(tp->sockfd_write);*/
|
|
+ tp = tp->next;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
/* Make new session and process group */
|
|
setsid();
|
|
|
|
+ close(fd);
|
|
+#if ENABLE_FEATURE_TELNETD_STANDALONE
|
|
+ close(sock);
|
|
+ if (master_fd >= 0)
|
|
+ close(master_fd);
|
|
+#endif
|
|
+
|
|
/* Open the child's side of the tty. */
|
|
/* NB: setsid() disconnects from any previous ctty's. Therefore
|
|
* we must open child's side of the tty AFTER setsid! */
|
|
@@ -329,14 +357,6 @@ make_new_session(
|
|
_exit(EXIT_FAILURE); /*bb_perror_msg_and_die("execv %s", loginpath);*/
|
|
}
|
|
|
|
-/* Must match getopt32 string */
|
|
-enum {
|
|
- OPT_WATCHCHILD = (1 << 2), /* -K */
|
|
- OPT_INETD = (1 << 3) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -i */
|
|
- OPT_PORT = (1 << 4) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -p */
|
|
- OPT_FOREGROUND = (1 << 6) * ENABLE_FEATURE_TELNETD_STANDALONE, /* -F */
|
|
-};
|
|
-
|
|
#if ENABLE_FEATURE_TELNETD_STANDALONE
|
|
|
|
static void
|
|
@@ -465,7 +485,7 @@ int telnetd_main(int argc UNUSED_PARAM,
|
|
|
|
#if ENABLE_FEATURE_TELNETD_STANDALONE
|
|
if (IS_INETD) {
|
|
- sessions = make_new_session(0);
|
|
+ sessions = make_new_session(-1, 0);
|
|
if (!sessions) /* pty opening or vfork problem, exit */
|
|
return 1; /* make_new_session prints error message */
|
|
} else {
|
|
@@ -553,7 +573,7 @@ int telnetd_main(int argc UNUSED_PARAM,
|
|
if (fd < 0)
|
|
goto again;
|
|
/* Create a new session and link it into our active list */
|
|
- new_ts = make_new_session(fd);
|
|
+ new_ts = make_new_session(master_fd, fd);
|
|
if (new_ts) {
|
|
new_ts->next = sessions;
|
|
sessions = new_ts;
|