[systemd-commits] src/stdout-syslog-bridge.c

Lennart Poettering lennart at kemper.freedesktop.org
Mon Sep 19 17:46:22 PDT 2011


 src/stdout-syslog-bridge.c |   30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

New commits:
commit a94e09a5b935a3fb64a4e2c9f22220899ff40294
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Sep 20 02:46:04 2011 +0200

    stdout-syslog-bridge: properly handle overly long log lines

diff --git a/src/stdout-syslog-bridge.c b/src/stdout-syslog-bridge.c
index 7358a42..9a04088 100644
--- a/src/stdout-syslog-bridge.c
+++ b/src/stdout-syslog-bridge.c
@@ -88,7 +88,7 @@ struct Stream {
         bool prefix:1;
         bool tee_console:1;
 
-        char buffer[LINE_MAX];
+        char buffer[LINE_MAX+1];
         size_t length;
 
         LIST_FIELDS(Stream, stream);
@@ -321,16 +321,25 @@ static int stream_scan(Stream *s, usec_t ts) {
         p = s->buffer;
         remaining = s->length;
         for (;;) {
-                char *newline;
-
-                if (!(newline = memchr(p, '\n', remaining)))
-                        break;
+                char *end;
+                size_t skip;
+
+                end = memchr(p, '\n', remaining);
+                if (!end) {
+                        if (remaining >= LINE_MAX) {
+                                end = p + LINE_MAX;
+                                skip = LINE_MAX;
+                        } else
+                                break;
+                } else
+                        skip = end - p + 1;
 
-                *newline = 0;
+                *end = 0;
 
-                if ((r = stream_line(s, p, ts)) >= 0) {
-                        remaining -= newline-p+1;
-                        p = newline+1;
+                r = stream_line(s, p, ts);
+                if (r >= 0) {
+                        remaining -= skip;
+                        p += skip;
                 }
         }
 
@@ -347,7 +356,8 @@ static int stream_process(Stream *s, usec_t ts) {
         int r;
         assert(s);
 
-        if ((l = read(s->fd, s->buffer+s->length, LINE_MAX-s->length)) < 0) {
+        l = read(s->fd, s->buffer+s->length, LINE_MAX-s->length);
+        if (l < 0) {
 
                 if (errno == EAGAIN)
                         return 0;



More information about the systemd-commits mailing list