From 08c8e66a996ddbb129f42e0fa121397b65b95aa9 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Wed, 13 Jan 2010 23:27:52 +0000 Subject: [PATCH] restore old buffer content when seek failed in http protocol, fix issue #1631 Originally committed as revision 21208 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/http.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libavformat/http.c b/libavformat/http.c index a404ff3df0..0c07592039 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -394,6 +394,8 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) HTTPContext *s = h->priv_data; URLContext *old_hd = s->hd; int64_t old_off = s->off; + uint8_t old_buf[BUFFER_SIZE]; + int old_buf_size; if (whence == AVSEEK_SIZE) return s->filesize; @@ -401,6 +403,8 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) return -1; /* we save the old context in case the seek fails */ + old_buf_size = s->buf_end - s->buf_ptr; + memcpy(old_buf, s->buf_ptr, old_buf_size); s->hd = NULL; if (whence == SEEK_CUR) off += s->off; @@ -410,6 +414,9 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) /* if it fails, continue on old connection */ if (http_open_cnx(h) < 0) { + memcpy(s->buffer, old_buf, old_buf_size); + s->buf_ptr = s->buffer; + s->buf_end = s->buffer + old_buf_size; s->hd = old_hd; s->off = old_off; return -1;