diff --git a/libavformat/async.c b/libavformat/async.c index 0cc6fb0e27..54dbd2312a 100644 --- a/libavformat/async.c +++ b/libavformat/async.c @@ -251,7 +251,7 @@ static int async_open(URLContext *h, const char *arg, int flags, AVDictionary ** /* wrap interrupt callback */ c->interrupt_callback = h->interrupt_callback; - ret = ffurl_open_whitelist(&c->inner, arg, flags, &interrupt_callback, options, h->protocol_whitelist, h->protocol_blacklist); + ret = ffurl_open_whitelist(&c->inner, arg, flags, &interrupt_callback, options, h->protocol_whitelist, h->protocol_blacklist, h); if (ret != 0) { av_log(h, AV_LOG_ERROR, "ffurl_open failed : %s, %s\n", av_err2str(ret), arg); goto url_fail; diff --git a/libavformat/avio.c b/libavformat/avio.c index 7e68c9a6e9..65075932ae 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -305,13 +305,16 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags, int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, - const char *whitelist, const char* blacklist) + const char *whitelist, const char* blacklist, + URLContext *parent) { AVDictionary *tmp_opts = NULL; AVDictionaryEntry *e; int ret = ffurl_alloc(puc, filename, flags, int_cb); if (ret < 0) return ret; + if (parent) + av_opt_copy(*puc, parent); if (options && (ret = av_opt_set_dict(*puc, options)) < 0) goto fail; @@ -352,7 +355,7 @@ int ffurl_open(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options) { return ffurl_open_whitelist(puc, filename, flags, - int_cb, options, NULL, NULL); + int_cb, options, NULL, NULL, NULL); } static inline int retry_transfer_wrapper(URLContext *h, uint8_t *buf, diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index f2f03f639f..f02ae21dfd 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -989,7 +989,7 @@ int ffio_open_whitelist(AVIOContext **s, const char *filename, int flags, URLContext *h; int err; - err = ffurl_open_whitelist(&h, filename, flags, int_cb, options, whitelist, blacklist); + err = ffurl_open_whitelist(&h, filename, flags, int_cb, options, whitelist, blacklist, NULL); if (err < 0) return err; err = ffio_fdopen(s, h); diff --git a/libavformat/cache.c b/libavformat/cache.c index 25b28d585f..6aabca2e78 100644 --- a/libavformat/cache.c +++ b/libavformat/cache.c @@ -87,7 +87,7 @@ static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary ** av_freep(&buffername); return ffurl_open_whitelist(&c->inner, arg, flags, &h->interrupt_callback, - options, h->protocol_whitelist, h->protocol_blacklist); + options, h->protocol_whitelist, h->protocol_blacklist, h); } static int add_entry(URLContext *h, const unsigned char *buf, int size) diff --git a/libavformat/concat.c b/libavformat/concat.c index 288bf14452..46b520fe80 100644 --- a/libavformat/concat.c +++ b/libavformat/concat.c @@ -98,7 +98,7 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags) /* creating URLContext */ err = ffurl_open_whitelist(&uc, node_uri, flags, - &h->interrupt_callback, NULL, h->protocol_whitelist, h->protocol_blacklist); + &h->interrupt_callback, NULL, h->protocol_whitelist, h->protocol_blacklist, h); if (err < 0) break; diff --git a/libavformat/crypto.c b/libavformat/crypto.c index 4222e1e33f..2999f50046 100644 --- a/libavformat/crypto.c +++ b/libavformat/crypto.c @@ -138,7 +138,7 @@ static int crypto_open2(URLContext *h, const char *uri, int flags, AVDictionary if ((ret = ffurl_open_whitelist(&c->hd, nested_url, flags, &h->interrupt_callback, options, - h->protocol_whitelist, h->protocol_blacklist)) < 0) { + h->protocol_whitelist, h->protocol_blacklist, h)) < 0) { av_log(h, AV_LOG_ERROR, "Unable to open resource: %s\n", nested_url); goto err; } diff --git a/libavformat/ftp.c b/libavformat/ftp.c index b9fee2450e..0663b47bc4 100644 --- a/libavformat/ftp.c +++ b/libavformat/ftp.c @@ -543,7 +543,7 @@ static int ftp_connect_control_connection(URLContext *h) } /* if option is not given, don't pass it and let tcp use its own default */ err = ffurl_open_whitelist(&s->conn_control, buf, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, &opts, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); av_dict_free(&opts); if (err < 0) { av_log(h, AV_LOG_ERROR, "Cannot open control connection\n"); @@ -597,7 +597,7 @@ static int ftp_connect_data_connection(URLContext *h) } /* if option is not given, don't pass it and let tcp use its own default */ err = ffurl_open_whitelist(&s->conn_data, buf, h->flags, &h->interrupt_callback, &opts, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); av_dict_free(&opts); if (err < 0) return err; diff --git a/libavformat/gopher.c b/libavformat/gopher.c index d1113e74e9..3070b24caf 100644 --- a/libavformat/gopher.c +++ b/libavformat/gopher.c @@ -94,7 +94,7 @@ static int gopher_open(URLContext *h, const char *uri, int flags) s->hd = NULL; err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE, - &h->interrupt_callback, NULL, h->protocol_whitelist, h->protocol_blacklist); + &h->interrupt_callback, NULL, h->protocol_whitelist, h->protocol_blacklist, h); if (err < 0) goto fail; diff --git a/libavformat/hlsproto.c b/libavformat/hlsproto.c index 097e5203c3..2b19ed0cf6 100644 --- a/libavformat/hlsproto.c +++ b/libavformat/hlsproto.c @@ -307,7 +307,7 @@ retry: av_log(h, AV_LOG_DEBUG, "opening %s\n", url); ret = ffurl_open_whitelist(&s->seg_hd, url, AVIO_FLAG_READ, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); if (ret < 0) { if (ff_check_interrupt(&h->interrupt_callback)) return AVERROR_EXIT; diff --git a/libavformat/http.c b/libavformat/http.c index 814ca014ce..622814bb05 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -221,7 +221,7 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options) if (!s->hd) { err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, options, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); if (err < 0) return err; } @@ -456,7 +456,7 @@ static int http_listen(URLContext *h, const char *uri, int flags, goto fail; if ((ret = ffurl_open_whitelist(&s->hd, lower_url, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, options, - h->protocol_whitelist, h->protocol_blacklist + h->protocol_whitelist, h->protocol_blacklist, h )) < 0) goto fail; s->handshake_step = LOWER_PROTO; @@ -1582,7 +1582,7 @@ static int http_proxy_open(URLContext *h, const char *uri, int flags) redo: ret = ffurl_open_whitelist(&s->hd, lower_url, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); if (ret < 0) return ret; diff --git a/libavformat/icecast.c b/libavformat/icecast.c index f7ca5cb30c..02e3e38788 100644 --- a/libavformat/icecast.c +++ b/libavformat/icecast.c @@ -165,7 +165,7 @@ static int icecast_open(URLContext *h, const char *uri, int flags) ff_url_join(h_url, sizeof(h_url), "http", auth, host, port, "%s", path); // Finally open http proto handler ret = ffurl_open_whitelist(&s->hd, h_url, AVIO_FLAG_READ_WRITE, NULL, - &opt_dict, h->protocol_whitelist, h->protocol_blacklist); + &opt_dict, h->protocol_whitelist, h->protocol_blacklist, h); cleanup: av_freep(&user); diff --git a/libavformat/md5proto.c b/libavformat/md5proto.c index 2df34c6350..0e04b90aac 100644 --- a/libavformat/md5proto.c +++ b/libavformat/md5proto.c @@ -71,7 +71,7 @@ static int md5_close(URLContext *h) if (*filename) { err = ffurl_open_whitelist(&out, filename, AVIO_FLAG_WRITE, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); if (err) return err; err = ffurl_write(out, buf, i*2+1); diff --git a/libavformat/mmst.c b/libavformat/mmst.c index 0f48b4615e..1d13959f58 100644 --- a/libavformat/mmst.c +++ b/libavformat/mmst.c @@ -530,7 +530,7 @@ static int mms_open(URLContext *h, const char *uri, int flags) ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, mmst->host, port, NULL); err = ffurl_open_whitelist(&mms->mms_hd, tcpname, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist); + h->protocol_whitelist, h->protocol_blacklist, h); if (err) goto fail; diff --git a/libavformat/rtmpcrypt.c b/libavformat/rtmpcrypt.c index 3d5eb22392..c41ae4308f 100644 --- a/libavformat/rtmpcrypt.c +++ b/libavformat/rtmpcrypt.c @@ -266,7 +266,7 @@ static int rtmpe_open(URLContext *h, const char *uri, int flags) /* open the tcp or ffrtmphttp connection */ if ((ret = ffurl_open_whitelist(&rt->stream, url, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist)) < 0) { + h->protocol_whitelist, h->protocol_blacklist, h)) < 0) { rtmpe_close(h); return ret; } diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index c01bc40204..18d915a5ee 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -1120,7 +1120,7 @@ static int rtmp_calc_swfhash(URLContext *s) /* Get the SWF player file. */ if ((ret = ffurl_open_whitelist(&stream, rt->swfverify, AVIO_FLAG_READ, &s->interrupt_callback, NULL, - s->protocol_whitelist, s->protocol_blacklist)) < 0) { + s->protocol_whitelist, s->protocol_blacklist, s)) < 0) { av_log(s, AV_LOG_ERROR, "Cannot open connection %s.\n", rt->swfverify); goto fail; } @@ -2650,7 +2650,7 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) reconnect: if ((ret = ffurl_open_whitelist(&rt->stream, buf, AVIO_FLAG_READ_WRITE, &s->interrupt_callback, &opts, - s->protocol_whitelist, s->protocol_blacklist)) < 0) { + s->protocol_whitelist, s->protocol_blacklist, s)) < 0) { av_log(s , AV_LOG_ERROR, "Cannot open connection %s\n", buf); goto fail; } diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c index 2062083aee..fa1dcb5570 100644 --- a/libavformat/rtpproto.c +++ b/libavformat/rtpproto.c @@ -382,7 +382,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) hostname, rtp_port, s->local_rtpport, sources, block); if (ffurl_open_whitelist(&s->rtp_hd, buf, flags, &h->interrupt_callback, - NULL, h->protocol_whitelist, h->protocol_blacklist) < 0) + NULL, h->protocol_whitelist, h->protocol_blacklist, h) < 0) goto fail; s->local_rtpport = ff_udp_get_local_port(s->rtp_hd); if(s->local_rtpport == 65535) { @@ -397,7 +397,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) sources, block); if (ffurl_open_whitelist(&s->rtcp_hd, buf, rtcpflags, &h->interrupt_callback, NULL, - h->protocol_whitelist, h->protocol_blacklist) < 0) { + h->protocol_whitelist, h->protocol_blacklist, h) < 0) { s->local_rtpport = s->local_rtcpport = -1; continue; } @@ -407,7 +407,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) hostname, s->rtcp_port, s->local_rtcpport, sources, block); if (ffurl_open_whitelist(&s->rtcp_hd, buf, rtcpflags, &h->interrupt_callback, - NULL, h->protocol_whitelist, h->protocol_blacklist) < 0) + NULL, h->protocol_whitelist, h->protocol_blacklist, h) < 0) goto fail; break; } diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index bbff70b37d..6888a2b11a 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1469,7 +1469,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, /* we will use two ports per rtp stream (rtp and rtcp) */ j += 2; err = ffurl_open_whitelist(&rtsp_st->rtp_handle, buf, AVIO_FLAG_READ_WRITE, - &s->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist); + &s->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist, NULL); av_dict_free(&opts); @@ -1612,7 +1612,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, ff_url_join(url, sizeof(url), "rtp", NULL, namebuf, port, "%s", optbuf); if (ffurl_open_whitelist(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE, - &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist) < 0) { + &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL) < 0) { err = AVERROR_INVALIDDATA; goto fail; } @@ -1801,7 +1801,7 @@ redirect: host, port, "?timeout=%d", rt->stimeout); if ((ret = ffurl_open_whitelist(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE, - &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist)) < 0) { + &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL)) < 0) { err = ret; goto fail; } @@ -2317,7 +2317,7 @@ static int sdp_read_header(AVFormatContext *s) rtsp_st->nb_exclude_source_addrs, rtsp_st->exclude_source_addrs); err = ffurl_open_whitelist(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ, - &s->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist); + &s->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist, NULL); av_dict_free(&opts); @@ -2387,7 +2387,7 @@ static int rtp_read_header(AVFormatContext *s) return AVERROR(EIO); ret = ffurl_open_whitelist(&in, s->filename, AVIO_FLAG_READ, - &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist); + &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL); if (ret) goto fail; diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c index ca7acc806b..a722b98e40 100644 --- a/libavformat/rtspdec.c +++ b/libavformat/rtspdec.c @@ -296,7 +296,7 @@ static int rtsp_read_setup(AVFormatContext *s, char* host, char *controlurl) av_log(s, AV_LOG_TRACE, "Opening: %s", url); ret = ffurl_open_whitelist(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE, &s->interrupt_callback, &opts, - s->protocol_whitelist, s->protocol_blacklist); + s->protocol_whitelist, s->protocol_blacklist, NULL); av_dict_free(&opts); if (ret) localport += 2; @@ -665,7 +665,7 @@ static int rtsp_listen(AVFormatContext *s) if (ret = ffurl_open_whitelist(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE, &s->interrupt_callback, NULL, - s->protocol_whitelist, s->protocol_blacklist)) { + s->protocol_whitelist, s->protocol_blacklist, NULL)) { av_log(s, AV_LOG_ERROR, "Unable to open RTSP for listening\n"); return ret; } diff --git a/libavformat/sapdec.c b/libavformat/sapdec.c index 218c32a2eb..522b38d10a 100644 --- a/libavformat/sapdec.c +++ b/libavformat/sapdec.c @@ -87,7 +87,7 @@ static int sap_read_header(AVFormatContext *s) port); ret = ffurl_open_whitelist(&sap->ann_fd, url, AVIO_FLAG_READ, &s->interrupt_callback, NULL, - s->protocol_whitelist, s->protocol_blacklist); + s->protocol_whitelist, s->protocol_blacklist, NULL); if (ret) goto fail; diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c index 0699e3e5b8..3098e340ca 100644 --- a/libavformat/sapenc.c +++ b/libavformat/sapenc.c @@ -151,7 +151,7 @@ static int sap_write_header(AVFormatContext *s) base_port += 2; ret = ffurl_open_whitelist(&fd, url, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL, - s->protocol_whitelist, s->protocol_blacklist); + s->protocol_whitelist, s->protocol_blacklist, NULL); if (ret) { ret = AVERROR(EIO); goto fail; @@ -171,7 +171,7 @@ static int sap_write_header(AVFormatContext *s) "?ttl=%d&connect=1", ttl); ret = ffurl_open_whitelist(&sap->ann_fd, url, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL, - s->protocol_whitelist, s->protocol_blacklist); + s->protocol_whitelist, s->protocol_blacklist, NULL); if (ret) { ret = AVERROR(EIO); goto fail; diff --git a/libavformat/smoothstreamingenc.c b/libavformat/smoothstreamingenc.c index 193c360db1..dabd1ea304 100644 --- a/libavformat/smoothstreamingenc.c +++ b/libavformat/smoothstreamingenc.c @@ -123,7 +123,7 @@ static int64_t ism_seek(void *opaque, int64_t offset, int whence) os->tail_out = os->out; av_dict_set(&opts, "truncate", "0", 0); ret = ffurl_open_whitelist(&os->out, frag->file, AVIO_FLAG_WRITE, - &os->ctx->interrupt_callback, &opts, os->ctx->protocol_whitelist, os->ctx->protocol_blacklist); + &os->ctx->interrupt_callback, &opts, os->ctx->protocol_whitelist, os->ctx->protocol_blacklist, NULL); av_dict_free(&opts); if (ret < 0) { os->out = os->tail_out; @@ -132,7 +132,7 @@ static int64_t ism_seek(void *opaque, int64_t offset, int whence) } av_dict_set(&opts, "truncate", "0", 0); ffurl_open_whitelist(&os->out2, frag->infofile, AVIO_FLAG_WRITE, - &os->ctx->interrupt_callback, &opts, os->ctx->protocol_whitelist, os->ctx->protocol_blacklist); + &os->ctx->interrupt_callback, &opts, os->ctx->protocol_whitelist, os->ctx->protocol_blacklist, NULL); av_dict_free(&opts); ffurl_seek(os->out, offset - frag->start_pos, SEEK_SET); if (os->out2) @@ -526,7 +526,7 @@ static int ism_flush(AVFormatContext *s, int final) continue; snprintf(filename, sizeof(filename), "%s/temp", os->dirname); - ret = ffurl_open_whitelist(&os->out, filename, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist); + ret = ffurl_open_whitelist(&os->out, filename, AVIO_FLAG_WRITE, &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL); if (ret < 0) break; os->cur_start_pos = os->tail_pos; diff --git a/libavformat/srtpproto.c b/libavformat/srtpproto.c index ef87c08e0d..5e6e5164d7 100644 --- a/libavformat/srtpproto.c +++ b/libavformat/srtpproto.c @@ -81,7 +81,7 @@ static int srtp_open(URLContext *h, const char *uri, int flags) path, sizeof(path), uri); ff_url_join(buf, sizeof(buf), "rtp", NULL, hostname, rtp_port, "%s", path); if ((ret = ffurl_open_whitelist(&s->rtp_hd, buf, flags, &h->interrupt_callback, - NULL, h->protocol_whitelist, h->protocol_blacklist)) < 0) + NULL, h->protocol_whitelist, h->protocol_blacklist, h)) < 0) goto fail; h->max_packet_size = FFMIN(s->rtp_hd->max_packet_size, diff --git a/libavformat/subfile.c b/libavformat/subfile.c index fdd328a084..fa971e1902 100644 --- a/libavformat/subfile.c +++ b/libavformat/subfile.c @@ -78,7 +78,7 @@ static int subfile_open(URLContext *h, const char *filename, int flags, } av_strstart(filename, "subfile:", &filename); ret = ffurl_open_whitelist(&c->h, filename, flags, &h->interrupt_callback, - options, h->protocol_whitelist, h->protocol_blacklist); + options, h->protocol_whitelist, h->protocol_blacklist, h); if (ret < 0) return ret; c->pos = c->start; diff --git a/libavformat/tls.c b/libavformat/tls.c index 2a59aa77c6..10e0792e29 100644 --- a/libavformat/tls.c +++ b/libavformat/tls.c @@ -106,5 +106,5 @@ int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char *uri, AV return ffurl_open_whitelist(&c->tcp, buf, AVIO_FLAG_READ_WRITE, &parent->interrupt_callback, options, - parent->protocol_whitelist, parent->protocol_blacklist); + parent->protocol_whitelist, parent->protocol_blacklist, parent); } diff --git a/libavformat/url.h b/libavformat/url.h index 4ce60cc8df..f19b91ccb0 100644 --- a/libavformat/url.h +++ b/libavformat/url.h @@ -136,12 +136,15 @@ int ffurl_connect(URLContext *uc, AVDictionary **options); * @param options A dictionary filled with protocol-private options. On return * this parameter will be destroyed and replaced with a dict containing options * that were not found. May be NULL. + * @param parent An enclosing URLContext, whose generic options should + * be applied to this URLContext as well. * @return >= 0 in case of success, a negative value corresponding to an * AVERROR code in case of failure */ int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, - const char *whitelist, const char* blacklist); + const char *whitelist, const char* blacklist, + URLContext *parent); int ffurl_open(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options);