From: Peter Hurley <peter@hurleysoftware.com>
To: Julio Guerra <julio@farjump.io>,
"Peter Hurley <peter@hurleysoftware.com>; Greg Kroah-Hartman"
<gregkh@linuxfoundation.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [BUG] drivers/tty: read() on a noncanonical blocking tty randomly fails when VMIN > received >= buf
Date: Wed, 4 May 2016 16:07:44 -0700 [thread overview]
Message-ID: <572A80C0.4080704@hurleysoftware.com> (raw)
In-Reply-To: <16504442-9e91-aaab-1f2b-9b4aa9c219f5@farjump.io>
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.
Regards,
Peter Hurley
> I isolated it in the following example (with VMIN = 5, received = 4, user buffer = 3):
> https://gist.github.com/Julio-Guerra/b3fdefab281403073607d81cabcea04a
>
> Since it is random, you will need run it several times to observe both cases. When correctly behaving, it should block in the read() for ever (C-c to kill it). When incorrectly behaving, it does not block and reads into the user buffer what is present in the kernel receive buffer (string "any").
>
> Example where it does not block 3 times out of 4:
> > $ ./a.out
> > res=3 buf=any
> > $ ./a.out
> > res=3 buf=any
> > $ ./a.out
> > ^C⏎
>
> Linux version 4.5.1-1-ARCH (builduser@tobias) (gcc version 5.3.0 (GCC) ) #1 SMP PREEMPT Thu Apr 14 19:19:32 CEST 2016
>
> [1] "Canonical and noncanonical mode", man termios
> [2] http://www.gnu.org/software/libc/manual/html_node/Noncanonical-Input.html
>
next prev parent reply other threads:[~2016-05-04 23:08 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 [this message]
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
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=572A80C0.4080704@hurleysoftware.com \
--to=peter@hurleysoftware.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox