text_input_stream: detect end-of-file

Fixes endless loop when the last line of a text file was not
terminated (bug 3470).
This commit is contained in:
Max Kellermann 2012-03-19 19:51:19 +01:00
parent 103832742d
commit 4f500149af
2 changed files with 18 additions and 2 deletions

1
NEWS
View File

@ -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)

View File

@ -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;