Denys Vlasenko wrote:
Here's one possible patch; another approach might be to set the FD_CLOEXEC
flag on those
descriptors which should not be inherited by telnetd's children.
--- busybox-1.13.2/networking/telnetd.c 2009/01/21 20:02:39 1.1
+++ busybox-1.13.2/networking/telnetd.c 2009/06/09 05:53:08
@@ -248,6 +248,8 @@
xopen(tty_name, O_RDWR); /* becomes our ctty */
xdup2(0, 1);
xdup2(0, 2);
+ for (fd = getdtablesize(); --fd >= 3; )
+ close(fd);
tcsetpgrp(0, getpid()); /* switch this tty's process group to us */
/* The pseudo-terminal allocated to the client is configured to
operate in
Does the attached patch help?
Which version of BB is that patch against? In all versions that I've
looked at, 1.13.4 included,
the call to setsid() occurs before the call to bb_signals(). So your
patch does not apply
cleanly. But anyway, I can see what it would do, and I'll give it a try
when I can. Looks
to me like it'll do the job. I think it still doesn't close master_fd
in the child, but aside from
being a bit messy, I don't think that will cause a problem. Why is your
slightly more complicated
patch better than the simple one that I provided anyway? Don't want to
count on getdtablesize()
being available? Don't like the idea of wasting time closing a bunch of
descriptors that probably
aren't open anyway?
--Doug.
------------------------------------------------------------------------
diff -d -urpN busybox.6/networking/telnetd.c busybox.7/networking/telnetd.c
--- busybox.6/networking/telnetd.c 2009-06-03 12:50:48.000000000 +0200
+++ busybox.7/networking/telnetd.c 2009-06-09 21:08:35.000000000 +0200
@@ -199,6 +199,14 @@ 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(
IF_FEATURE_TELNETD_STANDALONE(int sock)
@@ -288,6 +296,19 @@ 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();
@@ -329,14 +350,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
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox