On 05/06/2012 11:00, Rémi Forax wrote:
One of my student find a bug in the implementation of Scanner,
that allows you to use a non blocking channel as input of a Scanner.

The Scanner uses Channels.newReader() to create a Reader
from a channel which itself create a StreamDecoder.

In that case, StreamDecoder.impReader() goes into an infinite loop
because impReader() calls readBytes() that does nothing
if channel.read() returns zero.

The javadoc of Channels.newReader() clearly states that
it should throw a IllegalBlockingModeException but
there is no code that checks that.

I think a way to solve the problem is to insert a code
that check the blocking state in Channels.newWriter().

  if (ch instanceof SelectableChannel) {
            SelectableChannel sc = (SelectableChannel)ch;
            if (!sc.isBlocking())
                    throw new IllegalBlockingModeException();
            }
   }
This could be fixed in Channels.newReader or in StreamDecoder, the former would be consistent with Channels.newWriter. I guess you know this already, but you will need to synchronize on the selectable channel's blockingLock to ensure that the blocking mode doesn't change.

I've created a bug for this:

7174305: (ch) Channels.newReader doesn't throw IllegalBlockingMode if channel is configured non-blocking

-Alan.

Reply via email to