aboutsummaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
Diffstat (limited to 'networking')
-rw-r--r--networking/telnetd.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 21b704a46..9246f7052 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -21,7 +21,6 @@
* Set process group corrections, initial busybox port
*/
-/*#define DEBUG 1 */
#define DEBUG 0
#include "libbb.h"
@@ -34,8 +33,6 @@
#include <sys/syslog.h>
-#define BUFSIZE 4000
-
#if ENABLE_LOGIN
static const char *loginpath = "/bin/login";
#else
@@ -44,10 +41,6 @@ static const char *loginpath = DEFAULT_SHELL;
static const char *issuefile = "/etc/issue.net";
-/* shell name and arguments */
-
-static const char *argv_init[2];
-
/* structure that describes a session */
struct tsession {
@@ -60,6 +53,10 @@ struct tsession {
int rdidx2, wridx2, size2;
};
+/* Two buffers are directly after tsession in malloced memory.
+ * Make whole thing fit in 4k */
+enum { BUFSIZE = (4*1024 - sizeof(struct tsession)) / 2 };
+
/*
This is how the buffers are used. The arrows indicate the movement
of data.
@@ -231,6 +228,7 @@ make_new_session(
USE_FEATURE_TELNETD_STANDALONE(int sock_r, int sock_w)
SKIP_FEATURE_TELNETD_STANDALONE(void)
) {
+ const char *login_argv[2];
struct termios termbuf;
int fd, pid;
char tty_name[32];
@@ -283,7 +281,7 @@ make_new_session(
/* child */
- /* make new process group */
+ /* make new session and process group */
setsid();
/* open the child's side of the tty. */
@@ -294,7 +292,7 @@ make_new_session(
dup2(fd, 1);
dup2(fd, 2);
while (fd > 2) close(fd--);
- tcsetpgrp(0, getpid()); /* comment? */
+ tcsetpgrp(0, getpid()); /* switch this tty's process group to us */
/* The pseudo-terminal allocated to the client is configured to operate in
* cooked mode, and with XTABS CRMOD enabled (see tty(4)). */
@@ -308,9 +306,12 @@ make_new_session(
print_login_issue(issuefile, NULL);
- /* exec shell, with correct argv and env */
- execv(loginpath, (char *const *)argv_init);
- bb_perror_msg_and_die("execv");
+ /* exec shell / login /whatever */
+ login_argv[0] = loginpath;
+ login_argv[1] = NULL;
+ execv(loginpath, (char **)login_argv);
+ /* Hmmm... this gets sent to the client thru fd#2! Is it ok?? */
+ bb_perror_msg_and_die("execv %s", loginpath);
}
#if ENABLE_FEATURE_TELNETD_STANDALONE
@@ -405,7 +406,6 @@ int telnetd_main(int argc, char **argv)
/* Used to check access(loginpath, X_OK) here. Pointless.
* exec will do this for us for free later. */
- argv_init[0] = loginpath;
#if ENABLE_FEATURE_TELNETD_STANDALONE
if (IS_INETD) {