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>
This commit is contained in:
Michael Niedermayer 2014-03-06 02:04:15 +01:00
commit c832bf0c38
3 changed files with 18 additions and 8 deletions

View File

@ -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); ret = s->oformat->get_device_list(s, *device_list);
return s->iformat->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)

View File

@ -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) {

View File

@ -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) {