diff -pru busybox-1.2.2.1/networking/Config.in busybox-1.2.2.1_raf/networking/Config.in --- busybox-1.2.2.1/networking/Config.in 2006-07-01 00:42:02.000000000 +0200 +++ busybox-1.2.2.1_raf/networking/Config.in 2007-11-27 13:38:05.000000000 +0100 @@ -578,6 +578,16 @@ config CONFIG_FEATURE_TELNETD_INETD Selecting this will make telnetd only callable from inetd, removing the standalone support. +config CONFIG_FEATURE_TELNETD_MAX_SESSIONS + int "Max number of accepted sessions" + default 4 + range 0 100 + depends on CONFIG_TELNETD && ! CONFIG_FEATURE_TELNETD_INETD + help + Setting this options would limit the number of max accepted sessions + use 0 to allow an unlimited number of accepted sessions. This security + limitation could not work if telnetd is called by inetd superdaemon. + config CONFIG_TFTP bool "tftp" default n diff -pru busybox-1.2.2.1/networking/telnetd.c busybox-1.2.2.1_raf/networking/telnetd.c --- busybox-1.2.2.1/networking/telnetd.c 2006-07-01 00:42:02.000000000 +0200 +++ busybox-1.2.2.1_raf/networking/telnetd.c 2007-11-27 13:55:43.000000000 +0100 @@ -57,6 +57,8 @@ typedef struct sockaddr_in6 sockaddr_typ typedef struct sockaddr_in sockaddr_type; #endif +#define N_SESS_MAX CONFIG_FEATURE_TELNETD_MAX_SESSIONS +static int n_sess = 0; #ifdef CONFIG_LOGIN static const char *loginpath = "/bin/login"; @@ -372,6 +374,7 @@ free_session(struct tsession *ts) if (ts->ptyfd == maxfd || ts->sockfd == maxfd) maxfd--; + n_sess--; free(ts); } #endif /* CONFIG_FEATURE_TELNETD_INETD */ @@ -527,7 +530,14 @@ telnetd_main(int argc, char **argv) if ((fd = accept(master_fd, (struct sockaddr *)&sa, &salen)) < 0) { continue; - } else { + } else +#ifdef CONFIG_FEATURE_TELNETD_MAX_SESSIONS + if (n_sess >= N_SESS_MAX && N_SESS_MAX > 0) { + close(fd); + continue; + } else +#endif /* CONFIG_FEATURE_TELNETD_MAX_SESSIONS */ + { /* Create a new session and link it into our active list. */ struct tsession *new_ts = make_new_session(fd); @@ -536,6 +546,7 @@ telnetd_main(int argc, char **argv) sessions = new_ts; if (fd > maxfd) maxfd = fd; + n_sess++; } else { close(fd); }