[FFmpeg-devel] [PATCH] openssl: Support version 1.1.0.

wm4 nfxjfg at googlemail.com
Fri Oct 14 15:04:50 EEST 2016


On Mon, 10 Oct 2016 02:39:51 +1100
Matt Oliver <protogonoi at gmail.com> wrote:

> ---
>  configure                 |   3 +-
>  libavformat/tls_openssl.c | 159
> ++++++++++++++++++++++++++++------------------
>  2 files changed, 98 insertions(+), 64 deletions(-)
> 
> diff --git a/configure b/configure
> index df6ffa2..750684a 100755
> --- a/configure
> +++ b/configure
> @@ -5813,7 +5813,8 @@ enabled omx               && { check_header
> OMX_Core.h ||
>                                      add_cflags -isystem/opt/vc/include/IL
> ; }
>                                  check_header OMX_Core.h ; } ||
>                                 die "ERROR: OpenMAX IL headers not found"; }
> -enabled openssl           && { use_pkg_config openssl openssl/ssl.h
> SSL_library_init ||
> +enabled openssl           && { use_pkg_config openssl openssl/ssl.h
> OPENSSL_init_ssl ||
> +                               use_pkg_config openssl openssl/ssl.h
> SSL_library_init ||
>                                 check_lib openssl/ssl.h SSL_library_init
> -lssl -lcrypto ||
>                                 check_lib openssl/ssl.h SSL_library_init
> -lssl32 -leay32 ||
>                                 check_lib openssl/ssl.h SSL_library_init
> -lssl -lcrypto -lws2_32 -lgdi32 ||
> diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
> index 46eb3e6..4effb39 100644
> --- a/libavformat/tls_openssl.c
> +++ b/libavformat/tls_openssl.c
> @@ -63,6 +63,85 @@ static unsigned long openssl_thread_id(void)
>  #endif
>  #endif
> 
> +static int url_bio_create(BIO *b)
> +{
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +    BIO_set_init(b, 1);
> +    BIO_set_data(b, NULL);
> +    BIO_set_flags(b, 0);
> +#else
> +    b->init = 1;
> +    b->ptr = NULL;
> +    b->flags = 0;
> +#endif
> +    return 1;
> +}
> +
> +static int url_bio_destroy(BIO *b)
> +{
> +    return 1;
> +}
> +
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +#define BIO_GET_DATA(x) BIO_get_data(x);
> +#else
> +#define BIO_GET_DATA(x) x->ptr;
> +#endif
> +
> +static int url_bio_bread(BIO *b, char *buf, int len)
> +{
> +    URLContext *h = BIO_GET_DATA(b);
> +    int ret = ffurl_read(h, buf, len);
> +    if (ret >= 0)
> +        return ret;
> +    BIO_clear_retry_flags(b);
> +    if (ret == AVERROR_EXIT)
> +        return 0;
> +    return -1;
> +}
> +
> +static int url_bio_bwrite(BIO *b, const char *buf, int len)
> +{
> +    URLContext *h = BIO_GET_DATA(b);
> +    int ret = ffurl_write(h, buf, len);
> +    if (ret >= 0)
> +        return ret;
> +    BIO_clear_retry_flags(b);
> +    if (ret == AVERROR_EXIT)
> +        return 0;
> +    return -1;
> +}
> +
> +static long url_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
> +{
> +    if (cmd == BIO_CTRL_FLUSH) {
> +        BIO_clear_retry_flags(b);
> +        return 1;
> +    }
> +    return 0;
> +}
> +
> +static int url_bio_bputs(BIO *b, const char *str)
> +{
> +    return url_bio_bwrite(b, str, strlen(str));
> +}
> +
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +static BIO_METHOD* url_bio_method;

More global mutable data? Are you serious? We've been trying our best
to avoid these, and only awful APIs like OpenSSL or GnuTLS force us to
have them (as well as our own awful APIs). Please remove this global if
possible.

> +#else
> +static BIO_METHOD url_bio_method = {
> +    .type = BIO_TYPE_SOURCE_SINK,
> +    .name = "urlprotocol bio",
> +    .bwrite = url_bio_bwrite,
> +    .bread = url_bio_bread,
> +    .bputs = url_bio_bputs,
> +    .bgets = NULL,
> +    .ctrl = url_bio_ctrl,
> +    .create = url_bio_create,
> +    .destroy = url_bio_destroy,
> +};
> +#endif
> +
>  int ff_openssl_init(void)
>  {
>      avpriv_lock_avformat();
> @@ -86,6 +165,15 @@ int ff_openssl_init(void)
>  #endif
>          }
>  #endif
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +        url_bio_method = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "urlprotocol
> bio");
> +        BIO_meth_set_write(url_bio_method, url_bio_bwrite);
> +        BIO_meth_set_read(url_bio_method, url_bio_bread);
> +        BIO_meth_set_puts(url_bio_method, url_bio_bputs);
> +        BIO_meth_set_ctrl(url_bio_method, url_bio_ctrl);
> +        BIO_meth_set_create(url_bio_method, url_bio_create);
> +        BIO_meth_set_destroy(url_bio_method, url_bio_destroy);
> +#endif
>      }
>      openssl_init++;
>      avpriv_unlock_avformat();
> @@ -107,6 +195,9 @@ void ff_openssl_deinit(void)
>              av_free(openssl_mutexes);
>          }
>  #endif
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +        BIO_meth_free(url_bio_method);
> +#endif
>      }
>      avpriv_unlock_avformat();
>  }
> @@ -132,69 +223,6 @@ static int tls_close(URLContext *h)
>      return 0;
>  }
> 
> -static int url_bio_create(BIO *b)
> -{
> -    b->init = 1;
> -    b->ptr = NULL;
> -    b->flags = 0;
> -    return 1;
> -}
> -
> -static int url_bio_destroy(BIO *b)
> -{
> -    return 1;
> -}
> -
> -static int url_bio_bread(BIO *b, char *buf, int len)
> -{
> -    URLContext *h = b->ptr;
> -    int ret = ffurl_read(h, buf, len);
> -    if (ret >= 0)
> -        return ret;
> -    BIO_clear_retry_flags(b);
> -    if (ret == AVERROR_EXIT)
> -        return 0;
> -    return -1;
> -}
> -
> -static int url_bio_bwrite(BIO *b, const char *buf, int len)
> -{
> -    URLContext *h = b->ptr;
> -    int ret = ffurl_write(h, buf, len);
> -    if (ret >= 0)
> -        return ret;
> -    BIO_clear_retry_flags(b);
> -    if (ret == AVERROR_EXIT)
> -        return 0;
> -    return -1;
> -}
> -
> -static long url_bio_ctrl(BIO *b, int cmd, long num, void *ptr)
> -{
> -    if (cmd == BIO_CTRL_FLUSH) {
> -        BIO_clear_retry_flags(b);
> -        return 1;
> -    }
> -    return 0;
> -}
> -
> -static int url_bio_bputs(BIO *b, const char *str)
> -{
> -    return url_bio_bwrite(b, str, strlen(str));
> -}
> -
> -static BIO_METHOD url_bio_method = {
> -    .type = BIO_TYPE_SOURCE_SINK,
> -    .name = "urlprotocol bio",
> -    .bwrite = url_bio_bwrite,
> -    .bread = url_bio_bread,
> -    .bputs = url_bio_bputs,
> -    .bgets = NULL,
> -    .ctrl = url_bio_ctrl,
> -    .create = url_bio_create,
> -    .destroy = url_bio_destroy,
> -};
> -
>  static int tls_open(URLContext *h, const char *uri, int flags,
> AVDictionary **options)
>  {
>      TLSContext *p = h->priv_data;
> @@ -240,8 +268,13 @@ static int tls_open(URLContext *h, const char *uri,
> int flags, AVDictionary **op
>          ret = AVERROR(EIO);
>          goto fail;
>      }
> +#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
> +    bio = BIO_new(url_bio_method);
> +    BIO_set_data(bio, c->tcp);
> +#else
>      bio = BIO_new(&url_bio_method);
>      bio->ptr = c->tcp;
> +#endif
>      SSL_set_bio(p->ssl, bio, bio);
>      if (!c->listen && !c->numerichost)
>          SSL_set_tlsext_host_name(p->ssl, c->host);



More information about the ffmpeg-devel mailing list