Issue Details (XML | Word | Printable)

Key: NET-173
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Blocker Blocker
Assignee: Unassigned
Reporter: Scott Burch
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Commons Net

Duplicate IAC when sending a IAC using TelnetClient.getOutputStream()

Created: 07/Nov/07 04:37 PM   Updated: 05/Feb/09 06:40 PM
Return to search
Component/s: None
Affects Version/s: 1.4
Fix Version/s: None

Time Tracking:
Not Specified

Environment: Linux
Issue Links:
Reference
 

Resolution Date: 05/Feb/09 06:40 PM


 Description  « Hide
TelnetOutputStream.java appears to have a bug that if we send a IAC to the stream returned by TelnetClient.getOutputStream() we get duplicate IAC commands to the telnet server.

I looked through the code and I think I have found the reason.

Line 82-85 appears to just send two IAC commands.
82 case TelnetCommand.IAC:
83 __client._sendByte(TelnetCommand.IAC);
84 __client._sendByte(TelnetCommand.IAC);
85 break;

Line 91-95 appears to send the original character (which is a IAC) and a IAC thus producing two IACs in the stream.
91 else if (ch == TelnetCommand.IAC)
92 { 93 __client._sendByte(ch); 94 __client._sendByte(TelnetCommand.IAC); 95 }



50 public void write(int ch) throws IOException
51 {
52
53 synchronized (__client)
54 {
55 ch &= 0xff;
56
57 if (__client._requestedWont(TelnetOption.BINARY))
58 {
59 if (__lastWasCR)
60 {
61 if (__convertCRtoCRLF)this
62 {
63 __client._sendByte('\n');
64 if (ch == '\n')
65 { 66 __lastWasCR = false; 67 return ; 68 }
69 }
70 else if (ch != '\n')
71 __client._sendByte('\0');
72 }
73
74 __lastWasCR = false;
75
76 switch (ch)
77 { 78 case '\r': 79 __client._sendByte('\r'); 80 __lastWasCR = true; 81 break; 82 case TelnetCommand.IAC: 83 __client._sendByte(TelnetCommand.IAC); 84 __client._sendByte(TelnetCommand.IAC); 85 break; 86 default: 87 __client._sendByte(ch); 88 break; 89 }
90 }
91 else if (ch == TelnetCommand.IAC)
92 {93 __client._sendByte(ch);94 __client._sendByte(TelnetCommand.IAC);95 } }
96 else
97 __client._sendByte(ch);
98 }
99 }



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Rory Winston added a comment - 26/Feb/08 10:49 AM
Can you supply a patch for this?

Sebb added a comment - 16/May/08 04:26 PM
Surely the IAC character is used as an escape character and a command introducer?

So I think it needs to be duplicated.


Sebb added a comment - 16/May/08 04:28 PM
NET-89 points out that duplicated IACs need to be treated as IAC.

Scott Burch added a comment - 16/May/08 04:33 PM
That is not a very good work around because then it will not work with terminals that conform to the standards. Breaking the standards on both ends is not a solution. I had problems talking to a mini computer not running this stack.

The best solution is to fix this so that it sends the right commands to match the RFC.


Sebb added a comment - 16/May/08 05:15 PM
AFAIK, the Telnet standard is RFC854: http://www.ietf.org/rfc/rfc854.txt.

This says in section "TELNET COMMAND STRUCTURE" top of page 14:

inefficiency, of "escaping" the data bytes into the stream. With the
current set-up, only the IAC need be doubled to be sent as data, and
the other 255 codes may be passed transparently."

This is presumably the reason for the doubling seen in TelnetOutputStream.java


Scott Burch added a comment - 16/May/08 05:33 PM
Thank you for sending that.

Now, I think I know where the confusion is. What I was trying to do was send a command. I think what that part of the RFC was talking about was escaping 0xFF characters.

What I could not find was a way to send a command because (if I remember right) the stacks were hard wired together and could not be broken apart.

So, what I tried to do was send a IAC-COMMAND and what was coming out was IAC-IAC-COMMAND which the other end recognized as a IAC-0xFF substituting the second IAC for command. Then getting my COMMAND as data

I could not find a way around this, so we went with a different library.


Sebb added a comment - 16/May/08 05:49 PM
So can this issue be closed?

Scott Burch added a comment - 16/May/08 06:06 PM
If sending commands is not part of the library. Then yes. I now understand why my first assumption was wrong.

Unless you know of a way to send a command that I could not find.