ReaderInputStream enters infinite loop when it encounters an unmappable 
character
---------------------------------------------------------------------------------

                 Key: IO-277
                 URL: https://issues.apache.org/jira/browse/IO-277
             Project: Commons IO
          Issue Type: Bug
          Components: Streams/Writers
    Affects Versions: 2.0.1
            Reporter: Mike Thomas


The ReaderInputStream.read(byte[] b, int off, int len) method enters an 
infinite loop when its CharsetEncoder encounters an unmappable character in the 
input buffer.

When its CharsetEncoder encounters an unmappable character, the value of 
CoderResult lastCoderResult.isUnmappable() == true, and Reader.read() is not 
invoked on the underlying Reader ever again.

Attaching source file that reproduces this behavior.



One fix to consider is to call 
CharsetEncoder.onUnmappableCharacter(CodingErrorAction) in the 
ReaderInputStream constructor with a value other than the default 
CodingErrorAction.REPORT. e.g.:

public ReaderInputStream(Reader reader, Charset charset, int bufferSize) {
            this.reader = reader;
            encoder = charset.newEncoder();
            encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
...

By replacing the unmappable character with encoder's default replacement 
character, this effectively prevents the infinite loop from occurring. I'm not 
sure if that's the ideal behavior, but it seems fairly consistent with what 
org.apache.commons.io.output.WriterOutputStream does.


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to