From patchwork Wed Jun 15 19:51:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36246 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp552876pzb; Wed, 15 Jun 2022 12:52:34 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uRLq9woD83UcmMA1Oe0J4X3A7m+v8bVQWJ27i8hr/Q4s0mI8oz11aanUak+GVfB8/evCvV X-Received: by 2002:a17:907:248b:b0:70d:cedd:6c99 with SMTP id zg11-20020a170907248b00b0070dcedd6c99mr1253692ejb.675.1655322754660; Wed, 15 Jun 2022 12:52:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655322754; cv=none; d=google.com; s=arc-20160816; b=ckeJCc1lk5rgUMzNFCFtMfN9acbWhWiwoAqx9nYPPUpEA7Z0TpJCiiOKWUtUMcri1f Di69WiFkuxFAI689Qh0xm70h6LTduBf5XcoV2U/J9FZj48lw8uKcrwdUntWUu3OOeLwo o1KDhprH9+2CeEzo3icHFK4Q4P8DfakccpHkNBiOBJqUl9d2pyvlu35WP5MqW4fLuYu3 lo3TD2MuYyICgexQmQRwNaoXP1Veyta77QgVr5xaCs9PQ1BXwqZz6cxV3ZUKpkxcXtrN 0sJv+tg7xvRHbTT2hixHg0ZH1s7qdpBvnnl0w/ybllYgtBrHMZCefyaX9jfmiNGb4YuA KRcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=tHspD4n+Sq88m+F7C9n+UFANUTAmn5eJbM96C6bnSAI=; b=v/NPqeeWZ5KIDNV0P+By+RQL8mWJcnNNn4RYMMTL1pMI8+vjf7SpqUx2dp+DHJ+Puo +0OJLHR6CPfscnhftPC0yowGP5IXBmCTIt/Ta8x0l9y4R1usbLVK/eHRzUMyhozNkg01 KzXpaywvm1rWRnl5r+GBSZ7JzYtnq4h6BaXpWLTo0TJXF8VY9oWnhXTqQEtJXf7jmeL3 yo5bSz7uQPIIAq9h73uYLdvG4rVFl1/JN84j4JfQ/w38Qh/+7OQcseG2EeGS81uqg/L/ lArqt9ADg/QgnzvQTyeiNWMbchBDgdIOMjKJQA0hP30FwmPrfNvKYVAqE6AfwsQbe8oi lJPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=bA7+o3Ua; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mailo.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f5-20020a056402068500b0042d51baa7c1si119017edy.60.2022.06.15.12.52.34; Wed, 15 Jun 2022 12:52:34 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=bA7+o3Ua; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mailo.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4C5E168B71E; Wed, 15 Jun 2022 22:51:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from msg-4.mailo.com (ip-15.mailobj.net [213.182.54.15]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DDE4C68B692 for ; Wed, 15 Jun 2022 22:51:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655322698; bh=OxPOcJp9lA0e0mj3I6Ah8zFHfuyqzP/AyudxpZoOeqk=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=bA7+o3UaYoov0Fqn9yEw0QqwmTSRYih4jD4oGwmY6IfD1//BhyFzNYsQiATwLBWSt pxPlSw1BSZU2wwIXbYJo/e7R+j22zkqUU016jTPSictxrAmIfF//ZCsLBVh17HGR+I cF/Pw+vDR1O4y31CkOfUiybXe1aDTY3RY1xolRmo= Received: by b-4.in.mailobj.net [192.168.90.14] with ESMTP via ip-206.mailobj.net [213.182.55.206] Wed, 15 Jun 2022 21:51:38 +0200 (CEST) X-EA-Auth: kOoC1db0jvWjj6YWs38qWSgdJxb7gITAmD0bHIVImEIEaNoRcOFtXa42xBjIpXNGgGbTz1fI/WXq314sVcol6jnaW03ROkRnobFm2p2zgu8= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 22:51:27 +0300 Message-Id: <20220615195128.15796-4-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220615195128.15796-1-nil-admirari@mailo.com> References: <20220615195128.15796-1-nil-admirari@mailo.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v15 4/5] libavformat: Remove MAX_PATH limit and use UTF-8 version of getenv() X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: 71D7p3sHsUly 1. getenv() is replaced with getenv_utf8() across libavformat. 2. New versions of AviSynth+ are now called with UTF-8 filenames. 3. Old versions of AviSynth are still using ANSI strings, but MAX_PATH limit on filename is removed. --- libavformat/avisynth.c | 39 +++++++++++++++++++++++++++------------ libavformat/http.c | 20 +++++++++++++------- libavformat/ipfsgateway.c | 35 +++++++++++++++++++++++------------ libavformat/tls.c | 11 +++++++++-- 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c index 8ba2bdead2..a97d12b6b6 100644 --- a/libavformat/avisynth.c +++ b/libavformat/avisynth.c @@ -34,6 +34,7 @@ /* Platform-specific directives. */ #ifdef _WIN32 #include "compat/w32dlfcn.h" + #include "libavutil/wchar_filename.h" #undef EXTERN_C #define AVISYNTH_LIB "avisynth" #else @@ -56,6 +57,7 @@ typedef struct AviSynthLibrary { #define AVSC_DECLARE_FUNC(name) name ## _func name AVSC_DECLARE_FUNC(avs_bit_blt); AVSC_DECLARE_FUNC(avs_clip_get_error); + AVSC_DECLARE_FUNC(avs_check_version); AVSC_DECLARE_FUNC(avs_create_script_environment); AVSC_DECLARE_FUNC(avs_delete_script_environment); AVSC_DECLARE_FUNC(avs_get_audio); @@ -137,6 +139,7 @@ static av_cold int avisynth_load_library(void) LOAD_AVS_FUNC(avs_bit_blt, 0); LOAD_AVS_FUNC(avs_clip_get_error, 0); + LOAD_AVS_FUNC(avs_check_version, 0); LOAD_AVS_FUNC(avs_create_script_environment, 0); LOAD_AVS_FUNC(avs_delete_script_environment, 0); LOAD_AVS_FUNC(avs_get_audio, 0); @@ -807,26 +810,38 @@ static int avisynth_create_stream(AVFormatContext *s) static int avisynth_open_file(AVFormatContext *s) { AviSynthContext *avs = s->priv_data; - AVS_Value arg, val; + AVS_Value val; int ret; -#ifdef _WIN32 - char filename_ansi[MAX_PATH * 4]; - wchar_t filename_wc[MAX_PATH * 4]; -#endif if (ret = avisynth_context_create(s)) return ret; + if (!avs_library.avs_check_version(avs->env, 7)) { + AVS_Value args[] = { + avs_new_value_string(s->url), + avs_new_value_bool(1) // filename is in UTF-8 + }; + val = avs_library.avs_invoke(avs->env, "Import", + avs_new_value_array(args, 2), 0); + } else { + AVS_Value arg; #ifdef _WIN32 - /* Convert UTF-8 to ANSI code page */ - MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4); - WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi, - MAX_PATH * 4, NULL, NULL); - arg = avs_new_value_string(filename_ansi); + char *filename_ansi; + /* Convert UTF-8 to ANSI code page */ + if (utf8toansi(s->url, &filename_ansi)) { + ret = AVERROR_UNKNOWN; + goto fail; + } + arg = avs_new_value_string(filename_ansi); #else - arg = avs_new_value_string(s->url); + arg = avs_new_value_string(s->url); #endif - val = avs_library.avs_invoke(avs->env, "Import", arg, 0); + val = avs_library.avs_invoke(avs->env, "Import", arg, 0); +#ifdef _WIN32 + av_free(filename_ansi); +#endif + } + if (avs_is_error(val)) { av_log(s, AV_LOG_ERROR, "%s\n", avs_as_error(val)); ret = AVERROR_UNKNOWN; diff --git a/libavformat/http.c b/libavformat/http.c index c8f3f4b6a3..d90117e422 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -29,6 +29,7 @@ #include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/bprint.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/opt.h" #include "libavutil/time.h" #include "libavutil/parseutils.h" @@ -198,6 +199,7 @@ void ff_http_init_auth_state(URLContext *dest, const URLContext *src) static int http_open_cnx_internal(URLContext *h, AVDictionary **options) { const char *path, *proxy_path, *lower_proto = "tcp", *local_path; + char *env_http_proxy, *env_no_proxy; char *hashmark; char hostname[1024], hoststr[1024], proto[10]; char auth[1024], proxyauth[1024] = ""; @@ -211,9 +213,13 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options) path1, sizeof(path1), s->location); ff_url_join(hoststr, sizeof(hoststr), NULL, NULL, hostname, port, NULL); - proxy_path = s->http_proxy ? s->http_proxy : getenv("http_proxy"); - use_proxy = !ff_http_match_no_proxy(getenv("no_proxy"), hostname) && + env_http_proxy = getenv_utf8("http_proxy"); + proxy_path = s->http_proxy ? s->http_proxy : env_http_proxy; + + env_no_proxy = getenv_utf8("no_proxy"); + use_proxy = !ff_http_match_no_proxy(env_no_proxy, hostname) && proxy_path && av_strstart(proxy_path, "http://", NULL); + av_freep(&env_no_proxy); if (!strcmp(proto, "https")) { lower_proto = "tls"; @@ -224,7 +230,7 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options) if (s->http_proxy) { err = av_dict_set(options, "http_proxy", s->http_proxy, 0); if (err < 0) - return err; + goto end; } } if (port < 0) @@ -259,12 +265,12 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options) err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE, &h->interrupt_callback, options, h->protocol_whitelist, h->protocol_blacklist, h); - if (err < 0) - return err; } - return http_connect(h, path, local_path, hoststr, - auth, proxyauth); +end: + av_freep(&env_http_proxy); + return err < 0 ? err : http_connect( + h, path, local_path, hoststr, auth, proxyauth); } static int http_should_reconnect(HTTPContext *s, int err) diff --git a/libavformat/ipfsgateway.c b/libavformat/ipfsgateway.c index 83d52293b4..a8323403f0 100644 --- a/libavformat/ipfsgateway.c +++ b/libavformat/ipfsgateway.c @@ -20,6 +20,7 @@ */ #include "libavutil/avstring.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/opt.h" #include #include "os_support.h" @@ -55,12 +56,15 @@ static int populate_ipfs_gateway(URLContext *h) int stat_ret = 0; int ret = AVERROR(EINVAL); FILE *gateway_file = NULL; + char *env_ipfs_gateway, *env_ipfs_path; // Test $IPFS_GATEWAY. - if (getenv("IPFS_GATEWAY") != NULL) { - if (snprintf(c->gateway_buffer, sizeof(c->gateway_buffer), "%s", - getenv("IPFS_GATEWAY")) - >= sizeof(c->gateway_buffer)) { + env_ipfs_gateway = getenv_utf8("IPFS_GATEWAY"); + if (env_ipfs_gateway != NULL) { + int printed = snprintf(c->gateway_buffer, sizeof(c->gateway_buffer), + "%s", env_ipfs_gateway); + av_freep(&env_ipfs_gateway); + if (printed >= sizeof(c->gateway_buffer)) { av_log(h, AV_LOG_WARNING, "The IPFS_GATEWAY environment variable " "exceeds the maximum length. " @@ -77,20 +81,25 @@ static int populate_ipfs_gateway(URLContext *h) // We need to know the IPFS folder to - eventually - read the contents of // the "gateway" file which would tell us the gateway to use. - if (getenv("IPFS_PATH") == NULL) { + env_ipfs_path = getenv_utf8("IPFS_PATH"); + if (env_ipfs_path == NULL) { + char *env_home = getenv_utf8("HOME"); + av_log(h, AV_LOG_DEBUG, "$IPFS_PATH is empty.\n"); // Try via the home folder. - if (getenv("HOME") == NULL) { + if (env_home == NULL) { av_log(h, AV_LOG_WARNING, "$HOME appears to be empty.\n"); ret = AVERROR(EINVAL); goto err; } // Verify the composed path fits. - if (snprintf(ipfs_full_data_folder, sizeof(ipfs_full_data_folder), - "%s/.ipfs/", getenv("HOME")) - >= sizeof(ipfs_full_data_folder)) { + int printed = snprintf( + ipfs_full_data_folder, sizeof(ipfs_full_data_folder), + "%s/.ipfs/", env_home); + av_freep(&env_home); + if (printed >= sizeof(ipfs_full_data_folder)) { av_log(h, AV_LOG_WARNING, "The IPFS data path exceeds the " "max path length (%zu)\n", @@ -113,9 +122,11 @@ static int populate_ipfs_gateway(URLContext *h) goto err; } } else { - if (snprintf(ipfs_full_data_folder, sizeof(ipfs_full_data_folder), "%s", - getenv("IPFS_PATH")) - >= sizeof(ipfs_full_data_folder)) { + int printed = snprintf( + ipfs_full_data_folder, sizeof(ipfs_full_data_folder), + "%s", env_ipfs_path); + av_freep(&env_ipfs_path); + if (printed >= sizeof(ipfs_full_data_folder)) { av_log(h, AV_LOG_WARNING, "The IPFS_PATH environment variable " "exceeds the maximum length. " diff --git a/libavformat/tls.c b/libavformat/tls.c index 302c0f8d59..ea68f18d3a 100644 --- a/libavformat/tls.c +++ b/libavformat/tls.c @@ -26,6 +26,7 @@ #include "url.h" #include "tls.h" #include "libavutil/avstring.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" @@ -60,6 +61,7 @@ int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char *uri, AV char buf[200], opts[50] = ""; struct addrinfo hints = { 0 }, *ai = NULL; const char *proxy_path; + char *env_http_proxy, *env_no_proxy; int use_proxy; set_options(c, uri); @@ -89,9 +91,13 @@ int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char *uri, AV if (!c->host && !(c->host = av_strdup(c->underlying_host))) return AVERROR(ENOMEM); - proxy_path = c->http_proxy ? c->http_proxy : getenv("http_proxy"); - use_proxy = !ff_http_match_no_proxy(getenv("no_proxy"), c->underlying_host) && + env_http_proxy = getenv_utf8("http_proxy"); + proxy_path = c->http_proxy ? c->http_proxy : env_http_proxy; + + env_no_proxy = getenv_utf8("no_proxy"); + use_proxy = !ff_http_match_no_proxy(env_no_proxy, c->underlying_host) && proxy_path && av_strstart(proxy_path, "http://", NULL); + av_freep(&env_no_proxy); if (use_proxy) { char proxy_host[200], proxy_auth[200], dest[200]; @@ -104,6 +110,7 @@ int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char *uri, AV proxy_port, "/%s", dest); } + av_freep(&env_http_proxy); return ffurl_open_whitelist(&c->tcp, buf, AVIO_FLAG_READ_WRITE, &parent->interrupt_callback, options, parent->protocol_whitelist, parent->protocol_blacklist, parent);