From: Peter Hurley <peter@hurleysoftware.com>
To: One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>,
Julio Guerra <julio@farjump.io>
Cc: "Peter Hurley <peter@hurleysoftware.com>; Greg Kroah-Hartman"
<gregkh@linuxfoundation.org>,
linux-kernel@vger.kernel.org
Subject: Re: [BUG] drivers/tty: read() on a noncanonical blocking tty randomly fails when VMIN > received >= buf
Date: Thu, 5 May 2016 08:28:40 -0700 [thread overview]
Message-ID: <572B66A8.8080100@hurleysoftware.com> (raw)
In-Reply-To: <20160505110831.3548c1c7@lxorguk.ukuu.org.uk>
On 05/05/2016 03:08 AM, One Thousand Gnomes wrote:
> On Wed, 4 May 2016 16:07:44 -0700
> Peter Hurley <peter@hurleysoftware.com> wrote:
>
>> Hi Julio,
>>
>> On 05/04/2016 04:00 PM, Julio Guerra wrote:
>>> Hi,
>>>
>>> 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.
>
> The standard says
>
> Case B: MIN>0, TIME=0
>
> In case B, since the value of TIME is zero, the timer plays no
> role and only MIN is significant. A pending read shall not be
> satisfied until MIN bytes are received (that is, the pending read
> shall block until MIN bytes are received), or a signal is
> received. A program that uses case B to read record-based
> terminal I/O may block indefinitely in the read operation.
>
> That is if you do
>
>
> read(fd, buf, 3)
>
> and MIN is 5, the read should not return until there are 5 bytes in the
> queue. The following code is guaranteed to work reliably by the standard
> with TIME 0 MIN 5 (ignoring signals for the moment)
>
>
> read(fd, buf, 3);
> fcntl(fd, F_SETFL, FNDELAY);
> assert(read(fd, buf, 2) == 2);
>
> Historically this behaviour was useful for things like block transfer
> protocols, especially with offloaded serial processing.
>
> So actually I think we do have a bug, the behaviuour is not standards
> compliant, and the man page documents the erroneous behaviour.
I disagree; I think SUSv4 fails to address this degenerate condition at all.
For example, SUSv4 specifically states that there is no precedence of
MIN/TIME with O_NONBLOCK. IOW, the standard does _not_ guarantee that your
code fragment above won't block on the subsequent read anyway since it fails
to meet the new MIN 5 watermark.
But I have no problem fixing a bona fide regression; what's broken?
prev parent reply other threads:[~2016-05-05 15:28 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-04 23:00 [BUG] drivers/tty: read() on a noncanonical blocking tty randomly fails when VMIN > received >= buf Julio Guerra
2016-05-04 23:07 ` Peter Hurley
2016-05-04 23:27 ` Julio Guerra
2016-05-05 0:50 ` Peter Hurley
2016-05-05 10:08 ` One Thousand Gnomes
2016-05-05 15:28 ` Peter Hurley [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=572B66A8.8080100@hurleysoftware.com \
--to=peter@hurleysoftware.com \
--cc=gnomes@lxorguk.ukuu.org.uk \
--cc=gregkh@linuxfoundation.org \
--cc=julio@farjump.io \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.