summaryrefslogtreecommitdiff
path: root/libavformat/aviobuf.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2011-02-27 01:02:32 +0200
committerLuca Barbato <lu_zero@gentoo.org>2011-03-02 11:16:17 +0100
commite360ada2d13af36ab7afd9ebcd2bd236d23d9b96 (patch)
tree2aaa116d938feda59f5ab74a16a60d22af7d7f48 /libavformat/aviobuf.c
parent06ed4873e6e6aed8ec7cc24285d610ef4060880e (diff)
aviobuf: Write new data at s->buf_end in fill_buffer
In most cases, s->buf_ptr will be equal to s->buf_end when fill_buffer is called, but this may not always be the case, if we're seeking forward by reading (permitted by the short seek threshold). If fill_buffer is writing to s->buf_ptr instead of s->buf_end (when they aren't equal and s->buf_ptr is ahead of s->buffer), the data between s->buf_ptr and s->buf_end is overwritten, leading to inconsistent buffer content. This could return incorrect data if later seeking back into the area before the current s->buf_ptr. Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r--libavformat/aviobuf.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 0c733a704b..3f3721c58b 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -468,7 +468,7 @@ void put_tag(AVIOContext *s, const char *tag)
static void fill_buffer(AVIOContext *s)
{
- uint8_t *dst= !s->max_packet_size && s->buf_end - s->buffer < s->buffer_size ? s->buf_ptr : s->buffer;
+ uint8_t *dst= !s->max_packet_size && s->buf_end - s->buffer < s->buffer_size ? s->buf_end : s->buffer;
int len= s->buffer_size - (dst - s->buffer);
int max_buffer_size = s->max_packet_size ? s->max_packet_size : IO_BUFFER_SIZE;