From: Paul Fulghum <paulkf@microgate.com>
To: rupesh.sugathan@gmail.com
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
akpm@linux-foundation.org,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: + n_tty-loss-of-sync-following-a-buffer-overflow.patch added to -mm tree
Date: Wed, 12 Mar 2008 12:39:50 -0500 [thread overview]
Message-ID: <1205343590.4094.17.camel@x2.microgate.com> (raw)
In-Reply-To: <1205339539.8873.14.camel@estonia>
On Wed, 2008-03-12 at 09:32 -0700, Rupesh Sugathan wrote:
> The max line size from sender is 100 bytes. The read call waits for a
> maximum of 200 bytes.
OK, I understand what is happening.
Multiple lines are received while the N_TTY buffer is
full which increments canon_data multiple time without
setting multiple bits in read_flags. Essentially the
same bit in read_flags is set over and over.
When read_chan starts returning data, canon_data is
decremented once for each bit in read_flags which
leaves canon_data > 0 when there is no data to be read.
Even for the case of a single NL when N_TTY buffer is
full, the read_flag bit is set for tty->read_head when
that slot already contains data (same as tty->read_tail).
So the current code is wrong for the buffer full case.
What I suggest is the following patch for processing NL
in canonical mode.
If buffer full and previous character is not NL then
overwrite that char with NL truncating that line so
it is not prepended to subsequent data or left waiting
without a final NL.
If buffer full and previous character is NL (read_flag set)
then do nothing so canon_data remains in sync with read_flags.
Rupesh, can you try this out please?
Also, none of this answers why your N_TTY buffer is overflowing
it simply keeps things sane when it happens.
--- a/drivers/char/n_tty.c 2008-01-24 16:58:37.000000000 -0600
+++ b/drivers/char/n_tty.c 2008-03-12 12:16:06.000000000 -0500
@@ -839,10 +839,24 @@ send_signal:
handle_newline:
spin_lock_irqsave(&tty->read_lock, flags);
- set_bit(tty->read_head, tty->read_flags);
- put_tty_queue_nolock(c, tty);
- tty->canon_head = tty->read_head;
- tty->canon_data++;
+ if (tty->read_cnt == N_TTY_BUF_SIZE) {
+ int prev_head;
+ if (tty->read_head)
+ prev_head = tty->read_head - 1;
+ else
+ prev_head = N_TTY_BUF_SIZE - 1;
+ if (!test_bit(prev_head, tty->read_flags)) {
+ /* overwrite previous non NL char */
+ tty->read_cnt--;
+ tty->read_head = prev_head;
+ }
+ }
+ if (tty->read_cnt < N_TTY_BUF_SIZE) {
+ set_bit(tty->read_head, tty->read_flags);
+ put_tty_queue_nolock(c, tty);
+ tty->canon_head = tty->read_head;
+ tty->canon_data++;
+ }
spin_unlock_irqrestore(&tty->read_lock, flags);
kill_fasync(&tty->fasync, SIGIO, POLL_IN);
if (waitqueue_active(&tty->read_wait))
next parent reply other threads:[~2008-03-12 17:40 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200803120455.m2C4t4Aw010881@imap1.linux-foundation.org>
[not found] ` <20080312102729.58956d2c@the-village.bc.nu>
[not found] ` <47D7F531.2070400@microgate.com>
[not found] ` <1205339539.8873.14.camel@estonia>
2008-03-12 17:39 ` Paul Fulghum [this message]
2008-03-12 21:01 ` + n_tty-loss-of-sync-following-a-buffer-overflow.patch added to -mm tree Paul Fulghum
2008-03-12 20:54 ` Rupesh Sugathan
2008-03-12 23:40 ` Paul Fulghum
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=1205343590.4094.17.camel@x2.microgate.com \
--to=paulkf@microgate.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=rupesh.sugathan@gmail.com \
/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