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