]> git.ipfire.org Git - pakfire.git/commitdiff
log stream: Don't loop forever if we did not find a line break
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Jan 2025 17:47:55 +0000 (17:47 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 28 Jan 2025 17:47:55 +0000 (17:47 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/log_stream.c

index 7442242c0f73435a50eba09ba2087069e17a16a7..5a00158571dae9649946a025d9ff30672592a121 100644 (file)
@@ -114,6 +114,9 @@ struct pakfire_log_stream* pakfire_log_stream_unref(struct pakfire_log_stream* s
 static int pakfire_log_stream_fill_buffer(struct pakfire_log_stream* stream, int fd) {
        ssize_t bytes_read;
 
+       if (stream->buffered >= sizeof(stream->buffer))
+               return -EAGAIN;
+
        // Read into the buffer
        bytes_read = read(fd, stream->buffer + stream->buffered, sizeof(stream->buffer) - stream->buffered);
        if (bytes_read < 0)
@@ -138,11 +141,16 @@ static int pakfire_log_stream_drain_buffer(struct pakfire_log_stream* stream) {
        for (;;) {
                // Find the next line
                eol = memchr(stream->buffer, '\n', stream->buffered);
-               if (!eol)
-                       return 0;
+               if (!eol) {
+                       if (stream->buffered < sizeof(stream->buffer))
+                               return 0;
+               }
 
                // Determine the length of the line
-               length = eol - stream->buffer + 1;
+               if (eol)
+                       length = eol - stream->buffer + 1;
+               else
+                       length = stream->buffered;
 
                // Call the callback
                r = stream->callback(stream, stream->buffer, length, stream->data);