Thread (2 messages) 2 messages, 2 authors, 2016-05-05

Re: [BUG] drivers/tty: read() on a noncanonical blocking tty randomly fails when VMIN > received >= buf

From: Peter Hurley <hidden>
Date: 2016-05-05 00:51:01
Also in: lkml

On 05/04/2016 04:27 PM, Julio Guerra wrote:
quoted
quoted
When a tty (here a slave pty) is set in noncanonical input and blocking read modes, a read() randomly blocks when:
"VMIN > kernel received >= user buffer size > 0".

The standard says that read() should block until VMIN bytes are received [1][2]. Whether this is an implementation defined case not really specified by POSIX or not, it should not behave randomly (otherwise it really should be documented in termios manpage).
This is not a bug.

From the termios(3) man page:

       * MIN > 0; TIME == 0: read(2) blocks until the lesser of MIN bytes or the number of bytes requested are avail‐
         able, and returns the lesser of these two values.
This does not appear in my man...

Anyway, how do you explain the random behavior then?
A long standing bug in this read mode allows the asynchronous input
processing thread to race with the read() thread and become confused
about how much data remains.

I fixed this in 4.6; when I run your test on 4.6, it consistently
returns the full user buffer.

Regards,
Peter Hurley
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help