linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Hurley <peter@hurleysoftware.com>
To: Stas Sergeev <stsp@list.ru>
Cc: Margarita Manterola <margamanterola@gmail.com>,
	Maximiliano Curia <maxy@gnuservers.com.ar>,
	Stas Sergeev <stsp@users.sourceforge.net>,
	Pavel Machek <pavel@ucw.cz>,
	Arkadiusz Miskiewicz <a.miskiewicz@gmail.com>,
	One Thousand Gnomes <gnomes@lxorguk.ukuu.org.uk>,
	linux-kernel@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jslaby@suse.cz>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Caylan Van Larson <i@caylan.net>
Subject: Re: Large pastes into readline enabled programs causes breakage from v2.6.31 onwards
Date: Tue, 03 Dec 2013 12:00:15 -0500	[thread overview]
Message-ID: <529E0E1F.4010303@hurleysoftware.com> (raw)
In-Reply-To: <529D9DCD.5080003@list.ru>

On 12/03/2013 04:01 AM, Stas Sergeev wrote:
> 03.12.2013 04:18, Peter Hurley пишет:
>> Unfortunately, this patch breaks EOF push handling.
>>
>> Normally, when an EOF is found not at the line start, the output
>> is made available to a canonical reader (without the EOF) -- this is
>> commonly referred to as EOF push. An EOF at the beginning of a line
>> forces the read to return 0 bytes read, which the caller interprets
>> as an end-of-file and discontinues reading.
>>
>> Since this patch simulates an EOF push, an actual EOF push that
>> follows will appear to be an EOF at the beginning of a line and
>> cause read to return 0, thus indicating premature end-of-file.
>>
>> I've attached a simulation testcase that shows the unexpected EOF.
>>
>> I think this general approach is still the way forward with this bug
>> but I need to ponder how the simulated EOF push state can properly be
>> distinguished from the other eol conditions in canon_copy_from_read_buf()
>> so line_start is not reset to the read_tail.
> Hi Peter, why do you think this is even a problem?
> If you enable icanon and the first thing you did was
> to send VEOF, then you need an EOF.
> If you want to be backward-compatible, you'll likely need
> to go that route, because currently it works exactly that
> way, except that the read buffer is lost. Other than preserving
> the read buffer, my patch was not supposed to change anything.
> I already have a program (written, tested, went to customer,
> used in production, oops sorry:) that switches to icanon and
> sends VEOF to simulate EOF. If you change this, then the behaviour
> will depend on whether the reader happened to read the data
> while still in RAW mode or already in icanon mode, which will
> create an unfixable race.
>
> I think the only reliable and consistent fix would be to add ioctls
> for EOF and EOL pushes. Then people will not even need to switch
> back-n-forth like crazy. But as things are now, I think my patch
> is conservative and safe. Do you think it can break something real,
> other than the test-case? I think your test-case was made with the
> particular patch in mind, but it is not compatible with the current
> kernel, so it can't be "broken".

Stas,

Any unit test is specifically designed to break the code under test.
This unit test does in fact break a possible input: note specifically
that the writer is not changing the termios so has no control over
the timing of when the input is received.

Also note that the test is a simulation; the patch will break any
input stream under the following conditions:
1. The writer writes an EOF-terminated buffer
2. All the input is received _except_ the EOF; this is strictly
    timing-related and not controllable.
3. The reader changes the termios from non-canon -> canon.

At that point the damage is done; the read_flags will indicate
2 EOFs and the 2nd EOF will be interpreted as end-of-file because
it will appear to begin on a new line.

That said, this problem is definitely solvable; I'm just looking
for the best way to solve it.

Consider the total brute-force approach; a shadow read_flags that
distinguishes a real EOF receive from the fake EOF push initiated
by the patch. That would work, but I'm looking for a solution more
space-efficient and simpler than a duplicate 256-byte buffer :)

Regards,
Peter Hurley


  reply	other threads:[~2013-12-03 17:00 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-25 11:29 Large pastes into readline enabled programs causes breakage from v2.6.31 onwards Margarita Manterola
2013-07-25 23:09 ` Peter Hurley
2013-07-30 12:41   ` Maximiliano Curia
     [not found]   ` <20130730124117.41DC55E4006@freak.gnuservers.com.ar>
2013-07-30 16:08     ` Peter Hurley
2013-08-08 17:58       ` Maximiliano Curia
2013-08-17 15:28         ` Pavel Machek
2013-08-17 22:57           ` Margarita Manterola
2013-08-18  8:08             ` Geert Uytterhoeven
2013-09-03  5:17             ` Arkadiusz Miskiewicz
2013-10-24 16:00               ` Arkadiusz Miskiewicz
2013-10-29 13:50                 ` Maximiliano Curia
2013-10-30 11:21                   ` Peter Hurley
2013-11-17 18:29                     ` Pavel Machek
2013-11-17 21:38                       ` Margarita Manterola
2013-11-21  5:04                       ` Peter Hurley
2013-11-22 12:57                         ` Peter Hurley
2013-11-24  0:29                           ` One Thousand Gnomes
2013-11-24 11:55                             ` Peter Hurley
2013-11-26  1:16                               ` Peter Hurley
2013-12-03  0:18                                 ` Peter Hurley
2013-12-03  9:01                                   ` Stas Sergeev
2013-12-03 17:00                                     ` Peter Hurley [this message]
2013-12-03 19:18                                       ` Stas Sergeev
2013-12-03 23:53                                         ` Peter Hurley
2013-12-04 18:57                                           ` Stas Sergeev
2013-12-09 14:50                                             ` [PATCH v3] n_tty: Fix buffer overruns with larger-than-4k pastes Peter Hurley
     [not found]                                               ` <52A5EF3F.2070805@list.ru>
2013-12-09 17:10                                                 ` Peter Hurley
2013-12-10  6:15                                                   ` Stas Sergeev
2013-12-10 22:05                                                     ` Peter Hurley
2013-12-10 22:12                                                       ` [PATCH v4] " Peter Hurley
2013-12-17  0:57                                                         ` Greg Kroah-Hartman
2013-12-17  1:24                                                           ` Peter Hurley
2013-12-18 11:48                                                             ` Henrique de Moraes Holschuh
2013-12-18 13:41                                                               ` Peter Hurley
2014-01-28 12:03                                             ` Large pastes into readline enabled programs causes breakage from v2.6.31 onwards Pavel Machek
2014-01-28 12:17                                               ` Stas Sergeev
2014-01-28 13:31                                                 ` Peter Hurley
2013-08-19 12:25         ` Peter Hurley
2013-09-03 21:12           ` Maximiliano Curia
2013-09-12  1:36             ` 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=529E0E1F.4010303@hurleysoftware.com \
    --to=peter@hurleysoftware.com \
    --cc=a.miskiewicz@gmail.com \
    --cc=gnomes@lxorguk.ukuu.org.uk \
    --cc=gregkh@linuxfoundation.org \
    --cc=i@caylan.net \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=margamanterola@gmail.com \
    --cc=maxy@gnuservers.com.ar \
    --cc=pavel@ucw.cz \
    --cc=rjw@rjwysocki.net \
    --cc=stsp@list.ru \
    --cc=stsp@users.sourceforge.net \
    /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;
as well as URLs for NNTP newsgroup(s).