diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-03-06 02:04:15 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-06 02:04:18 +0100 |
commit | c832bf0c38a36698684971eca5f779d115b01976 (patch) | |
tree | 7f1d3016035c77fbcd7b71ca7d22697ab4d6d6ba | |
parent | 636273d3d4a8c42f51832e8bf83e566e875916bf (diff) | |
parent | 2475fdbd047d8956b03f1bfb1e3f896985fd8c7f (diff) | |
download | ffmpeg-c832bf0c38a36698684971eca5f779d115b01976.tar.gz |
Merge remote-tracking branch 'lukaszmluki/master'
* lukaszmluki/master:
lavd/avdevice: always free detected devices on error
lavf/http: return error from seek on invalid whence
lavf/http: return error on seeking to negative postion
lavf/avio: fix ffurl_alloc error checks
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavdevice/avdevice.c | 9 | ||||
-rw-r--r-- | libavformat/avio.c | 4 | ||||
-rw-r--r-- | libavformat/http.c | 13 |
3 files changed, 18 insertions, 8 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) 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) { diff --git a/libavformat/http.c b/libavformat/http.c index 7a0ba6cedd..f693c4d0c6 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -979,16 +979,21 @@ 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; + else if (whence != SEEK_SET) + return AVERROR(EINVAL); + 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) { |