[packages/kernel/LINUX_3_10] - add patch to fix large pastes into readline enabled programs

baggins baggins at pld-linux.org
Mon Nov 18 13:26:45 CET 2013


commit a0fe81df5fd4c499e452740db43b6e93bc6f5571
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Mon Nov 18 13:00:31 2013 +0100

    - add patch to fix large pastes into readline enabled programs

 kernel-large-readline-paste.patch | 96 +++++++++++++++++++++++++++++++++++++++
 kernel.spec                       |  6 +++
 2 files changed, 102 insertions(+)
---
diff --git a/kernel.spec b/kernel.spec
index 5855261..85706b1 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -224,6 +224,10 @@ Patch146:	kernel-aufs3+vserver.patch
 # Show normal colors in menuconfig with ncurses ABI 6
 Patch250:	kernel-fix_256colors_menuconfig.patch
 
+# https://lkml.org/lkml/2013/9/3/539
+# fill thread: https://lkml.org/lkml/2013/7/25/205
+Patch300:	kernel-large-readline-paste.patch
+
 # https://patchwork.kernel.org/patch/236261/
 Patch400:	kernel-virtio-gl-accel.patch
 
@@ -715,6 +719,8 @@ cd linux-%{basever}
 
 %patch250 -p1
 
+%patch300 -p1
+
 # virtio-gl
 %patch400 -p1
 
diff --git a/kernel-large-readline-paste.patch b/kernel-large-readline-paste.patch
new file mode 100644
index 0000000..8d76304
--- /dev/null
+++ b/kernel-large-readline-paste.patch
@@ -0,0 +1,96 @@
+�Hola Peter!
+
+El 2013-08-19 a las 08:25 -0400, Peter Hurley escribi�:
+> My primary concern is canonical readers not become stuck with a full
+> read buffer, even with bogus input data (IOW, that an error condition will
+> not prevent a reader from making forward progress). I believe that won't
+> happen with this change, but what I really need in this case is a detailed
+> analysis from you of why that won't happen. That analysis should be in
+> the patch changelog. (Feel free to send me private mail if you need help
+> preparing a patch.)
+
+I'm not sure what level of analysis you are looking for. The driver will block
+when there are no readers but as soon as there is a read call it unblocks.
+I've added this information to the patch description that I'm including below.
+
+> And the patch above has a bug that allows a negative 'left' to be
+> assigned to tty->receive_room which will be interpreted as a very large
+> positive value.
+
+Ok, fixed with an else clause. It could also use an extra &&, but it looks a
+bit confusing.
+
+> This approach still has several drawbacks.
+
+> 1) Since additional state is reset when the termios is changed by
+> readline(), the canonical line buffer state will be bogus.
+> This renders the termios change by readline() pointless; the
+> caller will not be able to retrieve expected input properly.
+
+> 2) Since the input data is interpreted with the current termios when
+> data is received, any embedded control characters will not be
+> interpreted properly; again, the caller will not be able to retrieve
+> expected input properly.
+
+Indeed this is correct, however this is not an issue of this patch but of the
+current interaction between the kernel and readline. In order to fix this, the
+reading buffer should always be in raw and only when responding to a read call
+for canonical mode should it be interpreted. This is a very big change, and
+I'm not sure if anybody will be interested in implementing it.
+
+> >What do you think? Is the proposed solution, or something along those lines,
+> >acceptable?
+
+> I'm wondering if this problem might be best addressed on the paste side
+> instead of the read side. Although this wouldn't be a magic bullet, it
+> would be easier to control when more paste data is added.
+
+I don't see how this could work, could you elaborate?
+
+This is the patch proposal, for comments:
+
+From 81afd3b666cbf94bb9923ebf87fb2017a7cd645e Mon Sep 17 00:00:00 2001
+From: Maximiliano Curia <maxy at gnuservers.com.ar>
+Date: Tue, 3 Sep 2013 22:48:34 +0200
+Subject: [PATCH] Only let characters through when there are active readers.
+
+If there is an active reader, previous behavior is in place. When there is no
+active reader, input is blocked until the next read call unblocks it.
+
+This fixes a long standing issue with readline when pasting more than 4096
+bytes.
+---
+ drivers/tty/n_tty.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
+index 4bf0fc0..cdc3b19 100644
+--- a/drivers/tty/n_tty.c
++++ b/drivers/tty/n_tty.c
+@@ -147,9 +147,16 @@ static int set_room(struct tty_struct *tty)
+ 	 * pending newlines, let characters through without limit, so
+ 	 * that erase characters will be handled.  Other excess
+ 	 * characters will be beeped.
++	 * If there is no reader waiting for the input, block instead of
++	 * letting the characters through.
+ 	 */
+ 	if (left <= 0)
+-		left = ldata->icanon && !ldata->canon_data;
++		if (waitqueue_active(&tty->read_wait)) {
++			left = ldata->icanon && !ldata->canon_data;
++		} else {
++			left = 0;
++		}
++
+ 	old_left = tty->receive_room;
+ 	tty->receive_room = left;
+ 
+-- 
+1.8.4.rc3
+
+
+-- 
+"Always code as if the person who ends up maintaining your code is a violent
+psychopath who knows where you live."
+-- John Woods
+Saludos /\/\ /\ >< `/
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/00b79b8921afe5481f79737de26b127a545cb806



More information about the pld-cvs-commit mailing list