gui: Discard overlong input lines.
authorAndre Noll <maan@systemlinux.org>
Mon, 18 Mar 2013 19:13:35 +0000 (20:13 +0100)
committerAndre Noll <maan@systemlinux.org>
Thu, 2 May 2013 17:56:08 +0000 (19:56 +0200)
If an external command produces output without newlines, the current
code ends up calling read_nonblock() with a buffer size of zero which
triggers the assertion in readv_nonblock().

Increase the output buffer to 32K and fix the problem by simply
discarding all input if the input buffer is full and contains no
newline character.

A better fix would be to discard everything until the next newline
character is read, but this requires more work, so let's go with this
simple fix for now.

gui.c

diff --git a/gui.c b/gui.c
index a4ee727..728fb9b 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -951,7 +951,7 @@ static int open_stat_pipe(void)
        return ret;
 }
 
-#define COMMAND_BUF_SIZE 4096
+#define COMMAND_BUF_SIZE 32768
 
 /*
  * This is the core select loop. Besides the (internal) signal
@@ -1023,6 +1023,10 @@ repeat:
                                if (command_fds[!i] < 0) /* both fds closed */
                                        return 0;
                        }
+                       if (cbo[i] == COMMAND_BUF_SIZE - 1) {
+                               PARA_NOTICE_LOG("discarding overlong line");
+                               cbo[i] = 0;
+                       }
                }
        }
        ret = read_stat_pipe(&rfds);