Author: sebb
Date: Thu Mar  3 01:26:16 2011
New Revision: 1076483

URL: http://svn.apache.org/viewvc?rev=1076483&view=rev
Log:
NET-345 Telnet client: not properly handling IAC bytes within subnegotiation 
messages.

Modified:
    commons/proper/net/trunk/src/changes/changes.xml
    
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/Telnet.java
    
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java

Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1076483&r1=1076482&r2=1076483&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml (original)
+++ commons/proper/net/trunk/src/changes/changes.xml Thu Mar  3 01:26:16 2011
@@ -54,7 +54,12 @@ The <action> type attribute can be add,u
 
     <body>
         <release version="3.0" date="TBA" description="TBA">
-            <action issue="NET-343" dev="sebb" type="add">
+            <action issue="NET-345" dev="sebb" type="fix" due-to="Archie 
Cobbs">
+            Telnet client: not properly handling IAC bytes within 
subnegotiation messages:
+            - failing to double IACs on output
+            - failing to de-double IACs in input
+            </action>
+            <action issue="NET-343" dev="sebb" type="add" due-to="Archie 
Cobbs">
             Telnet client: Support Client-initiated Subnegotiation Messages.
             </action>
             <action issue="NET-270" dev="sebb" type="fix">

Modified: 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/Telnet.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/Telnet.java?rev=1076483&r1=1076482&r2=1076483&view=diff
==============================================================================
--- 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/Telnet.java
 (original)
+++ 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/Telnet.java
 Thu Mar  3 01:26:16 2011
@@ -21,6 +21,8 @@ import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.OutputStream;
 import java.io.IOException;
+import java.util.Arrays;
+
 import org.apache.commons.net.SocketClient;
 
 /**
@@ -782,22 +784,21 @@ class Telnet extends SocketClient
             System.err.println("SEND SUBNEGOTIATION: ");
             if (subn != null)
             {
-                for (int ii = 0; ii < subn.length; ii++)
-                {
-                    System.err.println("subn["  + ii + "]=" + subn[ii]);
-                }
+                System.err.println(Arrays.toString(subn));
             }
         }
         if (subn != null)
         {
-            byte byteresp[] = new byte[subn.length];
+            _output_.write(_COMMAND_SB);
+            // Note _output_ is buffered, so might as well simplify by writing 
single bytes
             for (int ii = 0; ii < subn.length; ii++)
             {
-                byteresp[ii] = (byte) subn[ii];
+                byte b = (byte) subn[ii];
+                if (b == TelnetCommand.IAC) {
+                    _output_.write(b); // double any IAC bytes
+                }
+                _output_.write(b);
             }
-
-            _output_.write(_COMMAND_SB);
-            _output_.write(byteresp);
             _output_.write(_COMMAND_SE);
 
             /* Code Section added for sending the negotiation ASAP (start)*/

Modified: 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java
URL: 
http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java?rev=1076483&r1=1076482&r2=1076483&view=diff
==============================================================================
--- 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java
 (original)
+++ 
commons/proper/net/trunk/src/main/java/org/apache/commons/net/telnet/TelnetInputStream.java
 Thu Mar  3 01:26:16 2011
@@ -211,6 +211,9 @@ final class TelnetInputStream extends Bu
                 case TelnetCommand.IAC:
                     __receiveState = _STATE_DATA;
                     break; // exit to enclosing switch to return IAC from read
+                case TelnetCommand.SE: // unexpected byte! ignore it (don't 
send it as a command)
+                    __receiveState = _STATE_DATA;
+                    continue;
                 default:
                     __receiveState = _STATE_DATA;
                     __client._processCommand(ch); // Notify the user
@@ -258,12 +261,13 @@ final class TelnetInputStream extends Bu
                     continue;
                 default:
                     // store suboption char
-                    __suboption[__suboption_count++] = ch;
+                    if (__suboption_count < __suboption.length)
+                        __suboption[__suboption_count++] = ch;
                     break;
                 }
                 __receiveState = _STATE_SB;
                 continue;
-            case _STATE_IAC_SB:
+            case _STATE_IAC_SB: // IAC received during SB phase
                 switch (ch)
                 {
                 case TelnetCommand.SE:
@@ -274,11 +278,14 @@ final class TelnetInputStream extends Bu
                     }
                     __receiveState = _STATE_DATA;
                     continue;
-                default:
-                    __receiveState = _STATE_SB;
+                case TelnetCommand.IAC: // De-dup the duplicated IAC
+                    if (__suboption_count < __suboption.length)
+                        __suboption[__suboption_count++] = ch;
+                    break;
+                default:            // unexpected byte! ignore it
                     break;
                 }
-                __receiveState = _STATE_DATA;
+                __receiveState = _STATE_SB;
                 continue;
             /* TERMINAL-TYPE option (end)*/
             }


Reply via email to