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)