[FFmpeg-devel] [PATCH] libavformat/tls_libtls: handle TLS_WANT_POLLIN and TLS_WANT_POLLOUT return values
These values may be returned from libtls (even in the case of blocking file descriptors) when we need to read/write more TLS record data in order to read/write application data. The URLProtocol documentation says AVERROR(EAGAIN) should be returned in these cases. Signed-off-by: Michael Forney --- libavformat/tls_libtls.c | 4 1 file changed, 4 insertions(+) diff --git a/libavformat/tls_libtls.c b/libavformat/tls_libtls.c index ba83b56ffe..286454e452 100644 --- a/libavformat/tls_libtls.c +++ b/libavformat/tls_libtls.c @@ -159,6 +159,8 @@ static int ff_tls_read(URLContext *h, uint8_t *buf, int size) return ret; else if (ret == 0) return AVERROR_EOF; +else if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) +return AVERROR(EAGAIN); av_log(h, AV_LOG_ERROR, "%s\n", tls_error(p->ctx)); return AVERROR(EIO); } @@ -172,6 +174,8 @@ static int ff_tls_write(URLContext *h, const uint8_t *buf, int size) return ret; else if (ret == 0) return AVERROR_EOF; +else if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) +return AVERROR(EAGAIN); av_log(h, AV_LOG_ERROR, "%s\n", tls_error(p->ctx)); return AVERROR(EIO); } -- 2.24.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH] Fix build with LibreSSL
Signed-off-by: Michael Forney --- libavformat/tls_openssl.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c index c551ac7..9712856 100644 --- a/libavformat/tls_openssl.c +++ b/libavformat/tls_openssl.c @@ -43,7 +43,7 @@ typedef struct TLSContext { TLSShared tls_shared; SSL_CTX *ctx; SSL *ssl; -#if OPENSSL_VERSION_NUMBER >= 0x101fL +#if OPENSSL_VERSION_NUMBER >= 0x101fL && !defined(LIBRESSL_VERSION_NUMBER) BIO_METHOD* url_bio_method; #endif } TLSContext; @@ -68,7 +68,7 @@ static unsigned long openssl_thread_id(void) static int url_bio_create(BIO *b) { -#if OPENSSL_VERSION_NUMBER >= 0x101fL +#if OPENSSL_VERSION_NUMBER >= 0x101fL && !defined(LIBRESSL_VERSION_NUMBER) BIO_set_init(b, 1); BIO_set_data(b, NULL); BIO_set_flags(b, 0); @@ -85,7 +85,7 @@ static int url_bio_destroy(BIO *b) return 1; } -#if OPENSSL_VERSION_NUMBER >= 0x101fL +#if OPENSSL_VERSION_NUMBER >= 0x101fL && !defined(LIBRESSL_VERSION_NUMBER) #define GET_BIO_DATA(x) BIO_get_data(x); #else #define GET_BIO_DATA(x) (x)->ptr; @@ -133,7 +133,7 @@ static int url_bio_bputs(BIO *b, const char *str) return url_bio_bwrite(b, str, strlen(str)); } -#if OPENSSL_VERSION_NUMBER < 0x101fL +#if OPENSSL_VERSION_NUMBER < 0x101fL || defined(LIBRESSL_VERSION_NUMBER) static BIO_METHOD url_bio_method = { .type = BIO_TYPE_SOURCE_SINK, .name = "urlprotocol bio", @@ -212,7 +212,7 @@ static int tls_close(URLContext *h) SSL_CTX_free(c->ctx); if (c->tls_shared.tcp) ffurl_close(c->tls_shared.tcp); -#if OPENSSL_VERSION_NUMBER >= 0x101fL +#if OPENSSL_VERSION_NUMBER >= 0x101fL && !defined(LIBRESSL_VERSION_NUMBER) if (c->url_bio_method) BIO_meth_free(c->url_bio_method); #endif @@ -265,7 +265,7 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op ret = AVERROR(EIO); goto fail; } -#if OPENSSL_VERSION_NUMBER >= 0x101fL +#if OPENSSL_VERSION_NUMBER >= 0x101fL && !defined(LIBRESSL_VERSION_NUMBER) p->url_bio_method = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "urlprotocol bio"); BIO_meth_set_write(p->url_bio_method, url_bio_bwrite); BIO_meth_set_read(p->url_bio_method, url_bio_bread); -- 2.10.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] Fix build with LibreSSL
On 10/29/16, Matt Oliver wrote: > This also seems a bit odd, why is libreSSL setting an openssl version > number of 1.1.0 or higher when it doesnt actually conform to the > corresponding openssl version. LibreSSl setting the openssl version number > to 2.0.0 seems to be problematic and causes problems not just for ffmpeg. > Of course theres not much we can do about that but perhaps an alternative > to Michaels suggestion would be to just add a single check near the top of > the file that checks for libressl and then redefines the openssl version to > the api libressl actually supports. i.e. > > #ifdef LIBRESSL_VERSION_NUMBER > #undef OPENSSL_VERSION_NUMBER > #define OPENSSL_VERSION_NUMBER 0x1000107fL > #endif > > This I believe is what some other projects have done to avoid this issue > and is rather simple to add and prevents further clutter in our configure. > I dont have any preference between this and the other suggestion, im just > providing some alternatives. The above is pretty simple so if it works for > you i can write up a patch for that pretty easily. I'm not sure why libressl sets OPENSSL_VERSION_NUMBER to 0x2000L. Maybe so that they can pick and choose which openssl APIs to implement (rather than everything up through some version)? I'm fine with any of the suggested approaches. I just went with !defined(LIBRESSL_VERSION_NUMBER) in my original patch because that's what I've seen projects like curl, wpa_supplicant, and openvpn do. It also seems to be what openbsd is doing itself with patches in its ports tree (xca, stunnel, postfix). ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel