Bug 12736

Summary: Change telnet EoL to CR/NUL
Product: Busybox Reporter: Klaudiusz Staniek <kstaniek>
Component: NetworkingAssignee: unassigned
Status: NEW ---    
Severity: normal CC: busybox-cvs
Priority: P5    
Version: unspecified   
Target Milestone: ---   
Hardware: All   
OS: Linux   
Host: Target:
Build:

Description Klaudiusz Staniek 2020-04-02 09:39:06 UTC
There is a use case when you telnet to KVM serial console port and every new line is interpreted and two new lines. The typical symptom is that during authentication you can type username and when press enter it goes through password prompt with empty password. The KVM uses netcat to connect virtual serial port with TCP port instead of full telnetd implementation. There is no way to change that behaviour with any configuration knobs. 

The she solution would be to remove the '\n' on new line.
I have tested the following diff:

diff --git a/networking/telnet.c b/networking/telnet.c
index 9fc85050b..be84515b7 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -236,7 +236,7 @@ static void handle_net_output(int len)
 			 * like CR NUL - easier to talk to HTTP/SMTP servers.
 			 */
 			*dst = '\r'; /* Enter -> CR LF */
-			*++dst = '\n';
+			/* *++dst = '\n'; */
 		}
 #if 0
 /* putty's "special commands" mode does this: */

Just removing *++dst = '\n';

Maybe the solution would be to add the configuration option for telnet client to chose between CR/LF or CR/NUL.

It seems the most popular inetutils-telnet uses CR/NUL;


Here is the example
 
root@csm-server:/root$ telnet -l root 172.26.228.210 26993
 
Entering character mode
Escape character is '^]'.    <- press ENTER
 
 
 
User Access Verification
 
Username: user   <- press ENTER (it takes user and password as empty string – like you pressed enter twice)
Password:
 
User Access Verification <<< the authentication failed and moved to second attempt
 
Username: user
Password:
 
So after investigation I could make a workaround with the following construct:
 
LP=12345 RA=172.26.228.210 RP=26993 ; ( echo -e '\r' | socat -u - TCP:$RA:$RP ; socat TCP-LISTEN:$LP,reuseaddr,crnl TCP:$RA:$RP ) & sleep 1 ; telnet localhost $LP
 
The above command spawns the socat process which builds the tunnel to remote device (RA:RP) with cr<->crnl translation and makes it available as localport LP and then it runs telnet to that tunnel on local machine.
 
Here is the result:
 
root@csm-server:/root$ LP=12345 RA=172.26.228.210 RP=26993 ; ( echo -e '\r' | socat -u - TCP:$RA:$RP ; socat TCP-LISTEN:$LP,reuseaddr,crnl TCP:$RA:$RP ) & sleep 1 ; telnet localhost $LP
[1] 714
 
Entering character mode
Escape character is '^]'.  << press ENTER
 
 
Username: user <<< press ENTER
Password:        <- type password and press ENTER
 
 
RP/0/RP0/CPU0:R1#
Comment 1 Klaudiusz Staniek 2020-04-15 17:05:25 UTC
Anyone can comment please?
Comment 2 Klaudiusz Staniek 2020-05-11 08:31:03 UTC
Hi Team,
can you please provide feedback?
Thanks,
Klaus