From patchwork Fri Mar 26 14:11:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 26619 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 348EA44AA1A for ; Fri, 26 Mar 2021 16:20:11 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EA73568A17B; Fri, 26 Mar 2021 16:20:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 77AC6680ABA for ; Fri, 26 Mar 2021 16:20:05 +0200 (EET) Received: by mail-wm1-f49.google.com with SMTP id b2-20020a7bc2420000b029010be1081172so3095924wmj.1 for ; Fri, 26 Mar 2021 07:20:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=X//GVGXZk4ZwUuas0sek6aRkSqu5uI/+W3XtRb60IzE=; b=nk+jYvHHVDPGWVXYEtoMc8EMqHYiqvJAHi8qEnTecFl+MuIhWkkjKkl1fcjkx4PaWZ wj+uboB0nViN06M3F2ijVlg2yhUGexcNY3XP1Ox6pSFLCdCMcLjKIKCBEm0n3u/Ybnj3 eydaR9sUcXxvynTDBRYgmlt7Htl7vNai0j0jopMEEu9XpeoaWm+DyuxNAclvdJmR19hS oyJ1LPFNIO5ORM3Yh6HFM94Xjzj/7S0Hu3kZLlKcrsyFytEA/xyBkQWTj0n/6EfMmKHI 2Grsk8XXUd8UiejwAAKIjE1CRpvQDyPSQ1LF9jVbot9M4IEKEHUcbM+NVSbRVjFxQ+i1 xt6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=X//GVGXZk4ZwUuas0sek6aRkSqu5uI/+W3XtRb60IzE=; b=pD2CEwFQGAUMHjWngyiRQ2SNzbuQe2rYzRZXspJxUGi3H9YRt4COyIHOd7C+5Z2c9W pKfoIADtWVs2GtLhvMoT4I9U2YXK0f2+mIFk/5RuQbDPGtIXXPMrwZ3Sf70+hkYJSmlv LdyFoorQ8jX7983bzll7Rgda14Tr2d7izOiPcmNAFRGl69ikR9KY9IV8ct/w3Yob9Vl4 RC7tqcxvs2aEBH4LKY1RIgc3LQTvwCZcFDiN3q9ttD++YQIjshhkQJB4c0IAClpILpno NmHq5Rgm9CFim8GHC1TWiaA134dqLQXIKGYAeYSqRW2B7Z2TwgSlkU5qmn7HfE+w5sGd npmQ== X-Gm-Message-State: AOAM532wbEqVzran3yFvFPJD6UPxczF0unHY98awDlYvAIoj/9AaPuEU kjK4YYHkQyPn3vxrVcyraW9be3bA274Qp1NM X-Google-Smtp-Source: ABdhPJzjZX7m0KFe9+yLz5cQmYWmFVYpCO0tTQY4wWifqUsTDqIQkT4pOmlSiH0wgeC0wTfKInkJRg== X-Received: by 2002:a1c:a958:: with SMTP id s85mr13695525wme.4.1616767917054; Fri, 26 Mar 2021 07:11:57 -0700 (PDT) Received: from localhost (host-96-177.parnet.fi. [77.234.96.177]) by smtp.gmail.com with ESMTPSA id r206sm5291735wma.46.2021.03.26.07.11.56 for (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 26 Mar 2021 07:11:56 -0700 (PDT) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 26 Mar 2021 16:11:54 +0200 Message-Id: <20210326141155.48733-1-martin@martin.st> X-Mailer: git-send-email 2.24.3 (Apple Git-128) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] tls_openssl: Improve quality of printed error messages, pass IO error codes through X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Print every error in the stack, if more than one, and don't print bogus errors if there's none logged within OpenSSL. Retain the underlying IO error code, print an error message out of it, and pass the error code on to the caller. --- libavformat/tls_openssl.c | 41 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c index e0616acbc8..1d813cbbb5 100644 --- a/libavformat/tls_openssl.c +++ b/libavformat/tls_openssl.c @@ -46,6 +46,7 @@ typedef struct TLSContext { #if OPENSSL_VERSION_NUMBER >= 0x1010000fL BIO_METHOD* url_bio_method; #endif + int io_err; } TLSContext; #if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L @@ -124,13 +125,25 @@ void ff_openssl_deinit(void) static int print_tls_error(URLContext *h, int ret) { TLSContext *c = h->priv_data; + int printed = 0, e, averr = AVERROR(EIO); if (h->flags & AVIO_FLAG_NONBLOCK) { int err = SSL_get_error(c->ssl, ret); if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) return AVERROR(EAGAIN); } - av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); - return AVERROR(EIO); + while ((e = ERR_get_error()) != 0) { + av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(e, NULL)); + printed = 1; + } + if (c->io_err) { + av_log(h, AV_LOG_ERROR, "IO error: %s\n", av_err2str(c->io_err)); + printed = 1; + averr = c->io_err; + c->io_err = 0; + } + if (!printed) + av_log(h, AV_LOG_ERROR, "Unknown error\n"); + return averr; } static int tls_close(URLContext *h) @@ -178,29 +191,33 @@ static int url_bio_destroy(BIO *b) static int url_bio_bread(BIO *b, char *buf, int len) { - URLContext *h = GET_BIO_DATA(b); - int ret = ffurl_read(h, buf, len); + TLSContext *c = GET_BIO_DATA(b); + int ret = ffurl_read(c->tls_shared.tcp, buf, len); if (ret >= 0) return ret; BIO_clear_retry_flags(b); - if (ret == AVERROR(EAGAIN)) - BIO_set_retry_read(b); if (ret == AVERROR_EXIT) return 0; + if (ret == AVERROR(EAGAIN)) + BIO_set_retry_read(b); + else + c->io_err = ret; return -1; } static int url_bio_bwrite(BIO *b, const char *buf, int len) { - URLContext *h = GET_BIO_DATA(b); - int ret = ffurl_write(h, buf, len); + TLSContext *c = GET_BIO_DATA(b); + int ret = ffurl_write(c->tls_shared.tcp, buf, len); if (ret >= 0) return ret; BIO_clear_retry_flags(b); - if (ret == AVERROR(EAGAIN)) - BIO_set_retry_write(b); if (ret == AVERROR_EXIT) return 0; + if (ret == AVERROR(EAGAIN)) + BIO_set_retry_write(b); + else + c->io_err = ret; return -1; } @@ -291,10 +308,10 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op BIO_meth_set_create(p->url_bio_method, url_bio_create); BIO_meth_set_destroy(p->url_bio_method, url_bio_destroy); bio = BIO_new(p->url_bio_method); - BIO_set_data(bio, c->tcp); + BIO_set_data(bio, p); #else bio = BIO_new(&url_bio_method); - bio->ptr = c->tcp; + bio->ptr = p; #endif SSL_set_bio(p->ssl, bio, bio); if (!c->listen && !c->numerichost) From patchwork Fri Mar 26 14:11:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 26620 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 79E0644B2CF for ; Fri, 26 Mar 2021 17:21:56 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4CE0168A711; Fri, 26 Mar 2021 17:21:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C0090689A8D for ; Fri, 26 Mar 2021 17:21:49 +0200 (EET) Received: by mail-wr1-f46.google.com with SMTP id v11so5996803wro.7 for ; Fri, 26 Mar 2021 08:21:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=NB6nQiYYD9vYD20ezr7ss67811Q0vkvKGQbL27/gnCo=; b=PojVEc2Q3+X206Mv2s3WQ/XUClewGYrQTpuQAVRzhD8W5Hjx3s3l853JKqTUztzVKt hSpq3SANP5Q6xhHMc22eYE1+00k+0qdacXlo4IkO3iTRvYVkCe3RlegEBs2cQbEUXklO IoUAYRjZ9e0JUSp3tvPUGy6qGcBl3eXR2V6K8PVmiGV1W6dh2dfKukrIWX0j/0Hi/dn1 WjcKmdKT6pGoL7+9ixHUtl3dU2D1goCPQ02NY+xDiERloWb+2txIfuOtEerlOUeBe6CP 7IRnYHY6SupIDgKGSJcPPf9R/owgIlmcpTC2bLw9l/ztkv48QLnJeaXL7pC4e5Jy1ugh ZjTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NB6nQiYYD9vYD20ezr7ss67811Q0vkvKGQbL27/gnCo=; b=hBG11mfM9eSE8w/HXOI9onEKMWdZdtgcNsCQ/9W7C0zHmCb+PwGmyFeJg5SgM+OjEj z4RVjYxGZDrrjrf12qRgXP1J0XJRRp0+we3dlOaAr33KtoFTuTYzfLPt05I2sjL6Jc+K LkCpKNn54BzZjlZSnBrT3K0yZwoqVeyz3TXv3cOn0ybHAZ7sIcQGdR8cM6wC6OmsvDOV 4Gi5Rhlqis0uU/Yq8u0SkHXEpBeSx1SkkrihrQj+MX4ekre6QaSittJQGe5XrcJ6Wy4B PIxAHqviUk06HI6+Ft0dtw5xkgkB0bsb1oCepkDgXfVzeTEyeMRIxHon+2EVJvGU50/A eRxA== X-Gm-Message-State: AOAM532nIpRP6HQanjRG6YJTjpVG1dG5n5T7Ftl6gOgvKwVfxnZqbADz yi6TNBfOHoxM24wWZgK89aR7fFz00qtTcxme X-Google-Smtp-Source: ABdhPJxC4V6E4UQAhz4h79AvSCdAO3larOJc98nA4C+IT+Ou6GDOPsRIp9AfIXqlJVk3dI8H2NtFwQ== X-Received: by 2002:a5d:560e:: with SMTP id l14mr14603696wrv.10.1616767918373; Fri, 26 Mar 2021 07:11:58 -0700 (PDT) Received: from localhost (host-96-177.parnet.fi. [77.234.96.177]) by smtp.gmail.com with ESMTPSA id n9sm12362922wrx.46.2021.03.26.07.11.57 for (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 26 Mar 2021 07:11:58 -0700 (PDT) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 26 Mar 2021 16:11:55 +0200 Message-Id: <20210326141155.48733-2-martin@martin.st> X-Mailer: git-send-email 2.24.3 (Apple Git-128) In-Reply-To: <20210326141155.48733-1-martin@martin.st> References: <20210326141155.48733-1-martin@martin.st> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] tls_gnutls: Print the underlying IO error message and pass the error code through X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/tls_gnutls.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c index f9d5af7096..741578a596 100644 --- a/libavformat/tls_gnutls.c +++ b/libavformat/tls_gnutls.c @@ -51,6 +51,7 @@ typedef struct TLSContext { gnutls_session_t session; gnutls_certificate_credentials_t cred; int need_shutdown; + int io_err; } TLSContext; void ff_gnutls_init(void) @@ -73,6 +74,7 @@ void ff_gnutls_deinit(void) static int print_tls_error(URLContext *h, int ret) { + TLSContext *c = h->priv_data; switch (ret) { case GNUTLS_E_AGAIN: return AVERROR(EAGAIN); @@ -88,6 +90,12 @@ static int print_tls_error(URLContext *h, int ret) av_log(h, AV_LOG_ERROR, "%s\n", gnutls_strerror(ret)); break; } + if (c->io_err) { + av_log(h, AV_LOG_ERROR, "IO error: %s\n", av_err2str(c->io_err)); + ret = c->io_err; + c->io_err = 0; + return ret; + } return AVERROR(EIO); } @@ -108,32 +116,36 @@ static int tls_close(URLContext *h) static ssize_t gnutls_url_pull(gnutls_transport_ptr_t transport, void *buf, size_t len) { - URLContext *h = (URLContext*) transport; - int ret = ffurl_read(h, buf, len); + TLSContext *c = (TLSContext*) transport; + int ret = ffurl_read(c->tls_shared.tcp, buf, len); if (ret >= 0) return ret; if (ret == AVERROR_EXIT) return 0; - if (ret == AVERROR(EAGAIN)) + if (ret == AVERROR(EAGAIN)) { errno = EAGAIN; - else + } else { errno = EIO; + c->io_err = ret; + } return -1; } static ssize_t gnutls_url_push(gnutls_transport_ptr_t transport, const void *buf, size_t len) { - URLContext *h = (URLContext*) transport; - int ret = ffurl_write(h, buf, len); + TLSContext *c = (TLSContext*) transport; + int ret = ffurl_write(c->tls_shared.tcp, buf, len); if (ret >= 0) return ret; if (ret == AVERROR_EXIT) return 0; - if (ret == AVERROR(EAGAIN)) + if (ret == AVERROR(EAGAIN)) { errno = EAGAIN; - else + } else { errno = EIO; + c->io_err = ret; + } return -1; } @@ -179,7 +191,7 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op gnutls_credentials_set(p->session, GNUTLS_CRD_CERTIFICATE, p->cred); gnutls_transport_set_pull_function(p->session, gnutls_url_pull); gnutls_transport_set_push_function(p->session, gnutls_url_push); - gnutls_transport_set_ptr(p->session, c->tcp); + gnutls_transport_set_ptr(p->session, p); gnutls_priority_set_direct(p->session, "NORMAL", NULL); do { if (ff_check_interrupt(&h->interrupt_callback)) {