diff options
author | Denys Vlasenko | 2010-04-27 08:54:24 +0200 |
---|---|---|
committer | Denys Vlasenko | 2010-04-27 08:54:24 +0200 |
commit | 25b10d97e66a74d4e5a5571afb1b8369c31eefca (patch) | |
tree | 322fedaccad019ba343994174b21ed3172ee7ff6 | |
parent | 6646de02148cecdc1b97a999b10eaa930d9cfca5 (diff) | |
download | busybox-25b10d97e66a74d4e5a5571afb1b8369c31eefca.zip busybox-25b10d97e66a74d4e5a5571afb1b8369c31eefca.tar.gz |
telnet: prevent SEGV if we are requested TELOPT_NEW_ENVIRON.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/telnet.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/networking/telnet.c b/networking/telnet.c index 09f75cc..ec3db0c 100644 --- a/networking/telnet.c +++ b/networking/telnet.c @@ -299,7 +299,7 @@ static void put_iac_subopt(byte c, char *str) static void put_iac_subopt_autologin(void) { int len = strlen(G.autologin) + 6; // (2 + 1 + 1 + strlen + 2) - const char *user = "USER"; + const char *p = "USER"; if (G.iaclen + len > IACBUFSIZE) iac_flush(); @@ -310,13 +310,14 @@ static void put_iac_subopt_autologin(void) put_iac(TELQUAL_IS); put_iac(NEW_ENV_VAR); - while (*user) - put_iac(*user++); + while (*p) + put_iac(*p++); put_iac(NEW_ENV_VALUE); - while (*G.autologin) - put_iac(*G.autologin++); + p = G.autologin; + while (*p) + put_iac(*p++); put_iac(IAC); put_iac(SE); @@ -441,7 +442,6 @@ static void to_sga(void) static void to_ttype(void) { /* Tell server we will (or won't) do TTYPE */ - if (G.ttype) put_iac2(WILL, TELOPT_TTYPE); else @@ -453,7 +453,6 @@ static void to_ttype(void) static void to_new_environ(void) { /* Tell server we will (or will not) do AUTOLOGIN */ - if (G.autologin) put_iac2(WILL, TELOPT_NEW_ENVIRON); else @@ -505,12 +504,12 @@ static int subneg(byte c) G.telstate = TS_SUB2; #if ENABLE_FEATURE_TELNET_TTYPE else - if (c == TELOPT_TTYPE) + if (c == TELOPT_TTYPE && G.ttype) put_iac_subopt(TELOPT_TTYPE, G.ttype); #endif #if ENABLE_FEATURE_TELNET_AUTOLOGIN else - if (c == TELOPT_NEW_ENVIRON) + if (c == TELOPT_NEW_ENVIRON && G.autologin) put_iac_subopt_autologin(); #endif break; |