* 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>tags/n2.3
| @@ -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 avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) | ||||
| { | { | ||||
| int ret; | |||||
| av_assert0(s); | av_assert0(s); | ||||
| av_assert0(device_list); | av_assert0(device_list); | ||||
| av_assert0(s->oformat || s->iformat); | av_assert0(s->oformat || s->iformat); | ||||
| @@ -113,8 +114,12 @@ int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) | |||||
| if (!(*device_list)) | if (!(*device_list)) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| if (s->oformat) | 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) | void avdevice_free_list_devices(AVDeviceInfoList **device_list) | ||||
| @@ -270,7 +270,7 @@ int ffurl_open(URLContext **puc, const char *filename, int flags, | |||||
| const AVIOInterruptCB *int_cb, AVDictionary **options) | const AVIOInterruptCB *int_cb, AVDictionary **options) | ||||
| { | { | ||||
| int ret = ffurl_alloc(puc, filename, flags, int_cb); | int ret = ffurl_alloc(puc, filename, flags, int_cb); | ||||
| if (ret) | |||||
| if (ret < 0) | |||||
| return ret; | return ret; | ||||
| if (options && (*puc)->prot->priv_data_class && | if (options && (*puc)->prot->priv_data_class && | ||||
| (ret = av_opt_set_dict((*puc)->priv_data, options)) < 0) | (ret = av_opt_set_dict((*puc)->priv_data, options)) < 0) | ||||
| @@ -399,7 +399,7 @@ int avio_check(const char *url, int flags) | |||||
| { | { | ||||
| URLContext *h; | URLContext *h; | ||||
| int ret = ffurl_alloc(&h, url, flags, NULL); | int ret = ffurl_alloc(&h, url, flags, NULL); | ||||
| if (ret) | |||||
| if (ret < 0) | |||||
| return ret; | return ret; | ||||
| if (h->prot->url_check) { | if (h->prot->url_check) { | ||||
| @@ -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) | else if ((s->filesize == -1 && whence == SEEK_END) || h->is_streamed) | ||||
| return -1; | 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) | if (whence == SEEK_CUR) | ||||
| off += s->off; | off += s->off; | ||||
| else if (whence == SEEK_END) | else if (whence == SEEK_END) | ||||
| off += s->filesize; | off += s->filesize; | ||||
| else if (whence != SEEK_SET) | |||||
| return AVERROR(EINVAL); | |||||
| if (off < 0) | |||||
| return AVERROR(EINVAL); | |||||
| s->off = off; | 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 */ | /* if it fails, continue on old connection */ | ||||
| av_dict_copy(&options, s->chained_options, 0); | av_dict_copy(&options, s->chained_options, 0); | ||||
| if (http_open_cnx(h, &options) < 0) { | if (http_open_cnx(h, &options) < 0) { | ||||