Commit 4f500149 authored by Max Kellermann's avatar Max Kellermann

text_input_stream: detect end-of-file

Fixes endless loop when the last line of a text file was not terminated (bug 3470).
parent 10383274
......@@ -3,6 +3,7 @@ ver 0.16.8 (2012/??/??)
* decoder:
- vorbis (and others): fix seeking at startup
- ffmpeg: read the "year" tag
* fix endless loop in text file reader
ver 0.16.7 (2012/02/04)
......
......@@ -24,6 +24,7 @@
#include <glib.h>
#include <assert.h>
#include <string.h>
struct text_input_stream {
......@@ -67,7 +68,12 @@ text_input_stream_read(struct text_input_stream *tis)
do {
dest = fifo_buffer_write(tis->buffer, &length);
if (dest != NULL) {
if (dest != NULL && length >= 2) {
/* reserve one byte for the null terminator if
the last line is not terminated by a
newline character */
--length;
nbytes = input_stream_read(tis->is, dest, length,
&error);
if (nbytes > 0)
......@@ -77,13 +83,22 @@ text_input_stream_read(struct text_input_stream *tis)
g_error_free(error);
return NULL;
}
}
} else
nbytes = 0;
src = fifo_buffer_read(tis->buffer, &length);
if (src == NULL)
return NULL;
p = memchr(src, '\n', length);
if (p == NULL && nbytes == 0) {
/* end of file (or line too long): terminate
the current line */
dest = fifo_buffer_write(tis->buffer, &nbytes);
assert(dest != NULL);
*(char *)dest = '\n';
fifo_buffer_append(tis->buffer, 1);
}
} while (p == NULL);
length = p - src + 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment