[FFmpeg-devel] [PATCH 2/3] avformat: add protocol_whitelist

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Fri Jan 29 23:46:47 CET 2016


On 28.01.2016 23:49, Michael Niedermayer wrote:
> From: Michael Niedermayer <michael at niedermayer.cc>
> 
> TODO: Docs
> TODO: version bump
> 
> Note to maintainers: update tools
> 
> Note to maintainers: set a default whitelist for your protocol
> If that makes no sense then consider to set "none" and thus require the user to specify a white-list
> for sub-protocols to be opened
> 
> Note, testing and checking for missing changes is needed
> 
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
>  libavformat/avformat.h      |    7 +++++
>  libavformat/avio.c          |   66 ++++++++++++++++++++++++++++++++++++++++---
>  libavformat/avio.h          |    5 ++++
>  libavformat/avio_internal.h |    4 +++
>  libavformat/aviobuf.c       |   25 +++++++++++++---
>  libavformat/options_table.h |    1 +
>  libavformat/url.h           |    6 ++++
>  libavformat/utils.c         |   22 ++++++++++++---
>  8 files changed, 124 insertions(+), 12 deletions(-)

This looks good to me. I just have two minor points, see below.

>  int av_format_get_probe_score(const AVFormatContext *s);
> diff --git a/libavformat/avio.c b/libavformat/avio.c
> index 96b18fd..c5c6bb1 100644
> --- a/libavformat/avio.c
> +++ b/libavformat/avio.c
[...]
> @@ -201,12 +207,42 @@ fail:
>  
>  int ffurl_connect(URLContext *uc, AVDictionary **options)
>  {
> -    int err =
> +    int err;
> +    AVDictionary *tmp_opts = NULL;
> +    AVDictionaryEntry *e;
> +
> +    if (!options)
> +        options = &tmp_opts;
> +
> +    // Check that URLContext was initialized correctly and lists are matching if set
> +    av_assert0(!(e=av_dict_get(*options, "protocol_whitelist", NULL, 0)) ||
> +               !strcmp(uc->protocol_whitelist, e->value));
> +
> +    if (uc->protocol_whitelist && av_match_list(uc->prot->name, uc->protocol_whitelist, ',') <= 0) {
> +        av_log(uc, AV_LOG_ERROR, "Protocol not on whitelist \'%s\'!\n", uc->protocol_whitelist);
> +        return AVERROR(EINVAL);
> +    }
> +
> +    if (!uc->protocol_whitelist && uc->prot->default_whitelist) {
> +        uc->protocol_whitelist = av_strdup(uc->prot->default_whitelist);

I'd find a log message here quite useful for debugging, e.g.:
        av_log(uc, AV_LOG_DEBUG, "Setting default whitelist '%s'\n", uc->prot->default_whitelist);

> diff --git a/libavformat/url.h b/libavformat/url.h
> index 391e3bc..eb950f3 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -47,6 +47,7 @@ typedef struct URLContext {
>      int is_connected;
>      AVIOInterruptCB interrupt_callback;
>      int64_t rw_timeout;         /**< maximum time to wait for (network) read/write operation completion, in mcs */
> +    const char *protocol_whitelist;
>  } URLContext;
>  
>  typedef struct URLProtocol {
> @@ -94,6 +95,7 @@ typedef struct URLProtocol {
>      int (*url_close_dir)(URLContext *h);
>      int (*url_delete)(URLContext *h);
>      int (*url_move)(URLContext *h_src, URLContext *h_dst);
> +    char *default_whitelist;

This misses a 'const' and thus produces lots of warnings:
warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]

Best regards,
Andreas


More information about the ffmpeg-devel mailing list