[ 
https://issues.apache.org/jira/browse/NET-290?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rory Winston closed NET-290.
----------------------------

       Resolution: Fixed
    Fix Version/s: 2.1

Thanks Jonathan - well spotted and fix applied.

> DotTerminatedMessageReader does not parse \r \r \n correctly
> ------------------------------------------------------------
>
>                 Key: NET-290
>                 URL: https://issues.apache.org/jira/browse/NET-290
>             Project: Commons Net
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: RedHat Linux
> Linux XXX 2.6.18-128.2.1.el5 #1 SMP Wed Jul 8 11:54:47 EDT 2009 x86_64 x86_64 
> x86_64 GNU/Linux
> java version "1.6.0"
> OpenJDK  Runtime Environment (build 1.6.0-b09)
> OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)
>            Reporter: Jonathan Baker
>             Fix For: 2.1
>
>
> If the DotTerminatedMessageReader receives two carriage return characters at 
> the end of the line, it does not process them correctly.
> When the DTMR tries to read "\r\r\n" from the server, it does not process 
> this as a correct end of line.  The code handles the first \r as a standalone 
> character, but then does not process the second \r character to test for 
> end-of-line.  If this happens at the end of a file, the DTMR will not 
> recognize the '.' character as the end of file, and will try to read another 
> character.  This hangs the reader.
> The process flow breaks down in the following order.  The first \r character 
> is tested at line 127.  It then reads the second \r character at line 133.  
> The test fails, and the second \r is pushed in to the internalBuffer at line 
> 160.  The second time the read() method is called, the \r character is 
> returned without processing at line 90.  The third time the read() is called, 
> the \n character is read and checked at line 127.  But, because the preceding 
> \r character is not found first, it does not process this as EOL.  If the 
> next character is a '.', it is not processed as EOF.
> The following fix solves the problem by pushing the second \r character back 
> in to the reader stream (rather than putting it in the internalBuffer), where 
> it will be processed correctly:
> 160a160,163
> >                 else if ( ch == '\r' )
> >                 {
> >                       internalReader.unread( ch );
> >                 }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to