From f495fbe76a2665cdea092999ca2dbb603d13280c Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Fri, 28 Feb 2014 01:12:07 +0100 Subject: [PATCH 1/4] lavf/avio: fix ffurl_alloc error checks ffurl_alloc doc says it returns >= 0 in case of success. avio treats non-zero as errors. Signed-off-by: Lukasz Marek --- libavformat/avio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/avio.c b/libavformat/avio.c index a76f9db3b8..e366dfa388 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -270,7 +270,7 @@ int ffurl_open(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options) { int ret = ffurl_alloc(puc, filename, flags, int_cb); - if (ret) + if (ret < 0) return ret; if (options && (*puc)->prot->priv_data_class && (ret = av_opt_set_dict((*puc)->priv_data, options)) < 0) @@ -399,7 +399,7 @@ int avio_check(const char *url, int flags) { URLContext *h; int ret = ffurl_alloc(&h, url, flags, NULL); - if (ret) + if (ret < 0) return ret; if (h->prot->url_check) { From 4ba6a534dc94bd4ff44503de9c7985a456cfe503 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Fri, 28 Feb 2014 00:36:06 +0100 Subject: [PATCH 2/4] lavf/http: return error on seeking to negative postion Signed-off-by: Lukasz Marek --- libavformat/http.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 69c4d6d7a0..08832bde59 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -955,16 +955,19 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) else if ((s->filesize == -1 && whence == SEEK_END) || h->is_streamed) 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; else if (whence == SEEK_END) off += s->filesize; + if (off < 0) + return AVERROR(EINVAL); s->off = off; + /* 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 it fails, continue on old connection */ av_dict_copy(&options, s->chained_options, 0); if (http_open_cnx(h, &options) < 0) { From 1aa262f460c0814e71619a66a9652af4692a468a Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Fri, 28 Feb 2014 00:36:07 +0100 Subject: [PATCH 3/4] lavf/http: return error from seek on invalid whence Signed-off-by: Lukasz Marek --- libavformat/http.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavformat/http.c b/libavformat/http.c index 08832bde59..74e81625cd 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -959,6 +959,8 @@ static int64_t http_seek(URLContext *h, int64_t off, int whence) off += s->off; else if (whence == SEEK_END) off += s->filesize; + else if (whence != SEEK_SET) + return AVERROR(EINVAL); if (off < 0) return AVERROR(EINVAL); s->off = off; From 2475fdbd047d8956b03f1bfb1e3f896985fd8c7f Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Tue, 4 Mar 2014 02:57:27 +0100 Subject: [PATCH 4/4] lavd/avdevice: always free detected devices on error Signed-off-by: Lukasz Marek --- libavdevice/avdevice.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 8964b96f36..ea14c7a286 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -101,6 +101,7 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToA int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) { + int ret; av_assert0(s); av_assert0(device_list); av_assert0(s->oformat || s->iformat); @@ -113,8 +114,12 @@ int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) if (!(*device_list)) return AVERROR(ENOMEM); if (s->oformat) - return s->oformat->get_device_list(s, *device_list); - return s->iformat->get_device_list(s, *device_list); + ret = s->oformat->get_device_list(s, *device_list); + else + ret = s->iformat->get_device_list(s, *device_list); + if (ret < 0) + avdevice_free_list_devices(device_list); + return ret; } void avdevice_free_list_devices(AVDeviceInfoList **device_list)