From patchwork Wed Jun 15 19:51:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36243 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp552654pzb; Wed, 15 Jun 2022 12:52:02 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s/GGk2rSo1Za+uZM1vaL1YpzZ4ptmaC4eAZgCt1e4QYQNnRq4CdDA2Z1EGkeyCfygO5fyC X-Received: by 2002:a17:906:2f92:b0:711:cfe6:b117 with SMTP id w18-20020a1709062f9200b00711cfe6b117mr1225237eji.665.1655322722603; Wed, 15 Jun 2022 12:52:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655322722; cv=none; d=google.com; s=arc-20160816; b=s4Z1A3Rvd0NWYDyfoSNt8Qh2N59TfVzsQ2DcGPNOdSykewS0Lu+tEXeOlLcuOeB6AZ VmxxA1EQ8SVYe+c3lDgCp9R46Jvc7g8IA2Yjqqi44qdkjAySFUD57FMe3CtDSqS0w5+C YvBND41hPiwIzy/pEF1xhFY88pl+5xCQL+2P89MgaVMS5QC6JAEMqgEXNOiCJmjSAZCD dIevAvGJn4L0D8XU34DnFsxNXcmXrEQahPXCjLHW+TAEOYstZrVKea1j4Z4FH3jpJH04 RI/KAEmceoGQKYGnkQe22jnsaC7XkE3d/Ubeyji+HBbeGdPyaiZRbWMxtQmM91Snm3+L 0enA== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=2ffIg+FEiDDFyaXhW6yzFlxt10PbAFuSYX9v1lMJkts=; b=oMwXlN0tdXHEzrcKfV0MX/NPrbKfJdQlLwxsRp10s8VhstsRI8QmzeZ8DHSxBWlCQl wqzeTyz6gW7MIYlUJQlBuNvvoARzV88sDnWvIJ0OkaKyNxh6Ly8sJA5hhmbYLYATppoD TF4ajBclQyMZema5XtGIAGXsW5+qHampIl1PgbfRSz8en1+XqFRWDHQPFAie+STT1RWE v+HLl1bMGYIbibgc10RW18Zbq5E4tzZLefJIHSDaObI/NxvBC78oPfhaw6UdllfPPaDk 5Z2A1H7xG9wsHIirEFJ+9rOSwuMz4946037ZJYCU146eo9pZ0YLhs8wtkCqqQRlXcvOU 62vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=LSbxu47T; 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 w3-20020aa7da43000000b0043174e68c8esi71900eds.364.2022.06.15.12.52.02; Wed, 15 Jun 2022 12:52:02 -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=LSbxu47T; 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 20A3468B6F0; Wed, 15 Jun 2022 22:51:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from msg-1.mailo.com (msg-1.mailo.com [213.182.54.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5E8E68B02F 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=1655322695; bh=qM65tz5uT1neNwCdUeAIP3WcUO2oL5skPRv/6VbMdR0=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:MIME-Version: Content-Transfer-Encoding; b=LSbxu47THORRrsx0NEmcwuK54MqUk3zhgGBU3RGIghXYfp9ELEXKqWn/0othMi8bC zEJP1cdpJpGG3lQeqK898MzFzM4rn+eBLPMZOhAdbYFfx9YbGa9bY3lShl4n52wTBi +bLhAVx3QPz6HlTxUztd+w2ICSm3fZKuLgPeTDPE= 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:35 +0200 (CEST) X-EA-Auth: oGOAh2YrQXqUA4d7lb+4qgg3BKUoyNvJXn+wi29hL70bfvjwDtjt/T7Ye62of2uRq28keckDYCagMOm8K7rA+Nvunm9sHpcl+De6KHrYllk= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 22:51:24 +0300 Message-Id: <20220615195128.15796-1-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v15 1/5] libavutil: Add wchartoutf8(), wchartoansi(), utf8toansi() and getenv_utf8() 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: uLs7z0pUEcQE wchartoutf8() converts strings returned by WinAPI into UTF-8, which is FFmpeg's preffered encoding. Some external dependencies, such as AviSynth, are still not Unicode-enabled. utf8toansi() converts UTF-8 strings into ANSI in two steps: UTF-8 -> wchar_t -> ANSI. wchartoansi() is responsible for the second step of the conversion. Conversion in just one step is not supported by WinAPI. Since these character converting functions allocate the buffer of necessary size, they also facilitate the removal of MAX_PATH limit in places where fixed-size ANSI/WCHAR strings were used as filename buffers. getenv_utf8() wraps _wgetenv() converting its input from and its output to UTF-8. Compared to plain getenv(), getenv_utf8() requires a cleanup. Because of that, in places that only test the existence of an environment variable or compare its value with a string consisting entirely of ASCII characters, the use of plain getenv() is still preferred. (libavutil/log.c check_color_terminal() is an example of such a place.) Plain getenv() is also preffered in UNIX-only code, such as bktr.c, fbdev_common.c, oss.c in libavdevice or af_ladspa.c in libavfilter. --- .vscode/settings.json | 11 ++++++ configure | 1 + libavutil/getenv_utf8.h | 71 ++++++++++++++++++++++++++++++++++++++ libavutil/wchar_filename.h | 51 +++++++++++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 libavutil/getenv_utf8.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..e866d57743 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.associations": { + "w32dlfcn.h": "c", + "mem.h": "c", + "internal.h": "c", + "os_support.h": "c", + "packet_internal.h": "c", + "stdlib.h": "c", + "mathematics.h": "c" + } +} \ No newline at end of file diff --git a/configure b/configure index 3dca1c4bd3..fa37a74531 100755 --- a/configure +++ b/configure @@ -2272,6 +2272,7 @@ SYSTEM_FUNCS=" fcntl getaddrinfo getauxval + getenv gethrtime getopt GetModuleHandle diff --git a/libavutil/getenv_utf8.h b/libavutil/getenv_utf8.h new file mode 100644 index 0000000000..161e3e6202 --- /dev/null +++ b/libavutil/getenv_utf8.h @@ -0,0 +1,71 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_GETENV_UTF8_H +#define AVUTIL_GETENV_UTF8_H + +#include + +#include "mem.h" + +#ifdef HAVE_GETENV + +#ifdef _WIN32 + +#include "libavutil/wchar_filename.h" + +static inline char *getenv_utf8(const char *varname) +{ + wchar_t *varname_w, *var_w; + char *var; + + if (utf8towchar(varname, &varname_w)) + return NULL; + if (!varname_w) + return NULL; + + var_w = _wgetenv(varname_w); + av_free(varname_w); + + if (!var_w) + return NULL; + if (wchartoutf8(var_w, &var)) + return NULL; + + return var; + + // No CP_ACP fallback compared to other *_utf8() functions: + // non UTF-8 strings must not be returned. +} + +#else + +static inline char *getenv_utf8(const char *varname) +{ + return av_strdup(getenv(varname)); +} + +#endif // _WIN32 + +#else + +#define getenv_utf8(x) NULL + +#endif // HAVE_GETENV + +#endif // AVUTIL_GETENV_UTF8_H diff --git a/libavutil/wchar_filename.h b/libavutil/wchar_filename.h index f36d9dfea3..a6d71e52e5 100644 --- a/libavutil/wchar_filename.h +++ b/libavutil/wchar_filename.h @@ -41,6 +41,57 @@ static inline int utf8towchar(const char *filename_utf8, wchar_t **filename_w) return 0; } +av_warn_unused_result +static inline int wchartocp(unsigned int code_page, const wchar_t *filename_w, + char **filename) +{ + DWORD flags = code_page == CP_UTF8 ? WC_ERR_INVALID_CHARS : 0; + int num_chars = WideCharToMultiByte(code_page, flags, filename_w, -1, + NULL, 0, NULL, NULL); + if (num_chars <= 0) { + *filename = NULL; + return 0; + } + *filename = av_malloc_array(num_chars, sizeof *filename); + if (!*filename) { + errno = ENOMEM; + return -1; + } + WideCharToMultiByte(code_page, flags, filename_w, -1, + *filename, num_chars, NULL, NULL); + return 0; +} + +av_warn_unused_result +static inline int wchartoutf8(const wchar_t *filename_w, char **filename) +{ + return wchartocp(CP_UTF8, filename_w, filename); +} + +av_warn_unused_result +static inline int wchartoansi(const wchar_t *filename_w, char **filename) +{ + return wchartocp(CP_ACP, filename_w, filename); +} + +av_warn_unused_result +static inline int utf8toansi(const char *filename_utf8, char **filename) +{ + wchar_t *filename_w = NULL; + int ret = -1; + if (utf8towchar(filename_utf8, &filename_w)) + return -1; + + if (!filename_w) { + *filename = NULL; + return 0; + } + + ret = wchartoansi(filename_w, filename); + av_free(filename_w); + return ret; +} + /** * Checks for extended path prefixes for which normalization needs to be skipped. * see .NET6: PathInternal.IsExtended() From patchwork Wed Jun 15 19:51:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36244 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp552714pzb; Wed, 15 Jun 2022 12:52:13 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sSXQqKvGsWMuFzhbV8c7c0YNZe6n/aYe4Qsilgh2Um7cI6yY0jFQCEc3q6Y3zx/re6nnBy X-Received: by 2002:a05:6402:2804:b0:431:7dde:6fb5 with SMTP id h4-20020a056402280400b004317dde6fb5mr1760883ede.379.1655322733119; Wed, 15 Jun 2022 12:52:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655322733; cv=none; d=google.com; s=arc-20160816; b=AeDs5NM3M4wJGpplx2NZY198KfYhMGxTGgXiblvi8wdpoe/KbF6c4ru7xiZIfA0HAp uzBhIECDpN+/+gDohqiCQvGSDEHEeCgqB+NZo11RWTnH9n1ETqfhvO+h+YUfeAdPnAiv Is3ZckQFZ5lXRbcLTFeczdipwQ03upSSlSAMKbz+zoqWEtaRZt7IQBj3Dwwa8qvTrAWE rnZbh+iPKhnD+2/LiggUuoVBG/LaPzTYcKCl4xaPU4BIrpX3mwuF4RfcNPSiag3NEFb8 +OkXW6VZXbAKsg1whEL6CwlJ3r8BmkbYpV4x3LQK6rrQRFcSC7nTyACJwq1NmqMmbcde bY+A== 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=LENNNTolts8oXHwUxSd7Yy0b2jSMjHAp4u46UEgH5zI=; b=YbnzJIaeD3amg15QTrSuoU2FhZLjNUUBxjzYWqdCnJqzUlkAb035biTf1ccNXR0Z4d SAXE/IGdfNVfaSOYrKZal1RQ5vOdnzy5ITmA8Jd8H9Jwu7hUeAJvUEauj2v8Yp47FoEi NavbaMNndOlwWc4tWuUhtsCF5WCuZQ3JL/tPiw90dEOuDTNsPn+k8+Mk0QHw5dUlyD5/ NhTsUYu9atGqeB7lMrxDzWbGLmLq/BF9tnzg78pAC5NETV6H/OcYro02yRUyQFYNdI3W jbDLDLC/jLPLK4FnMrYEH+kpxFNskoA8op0ZpxORO2ZtmrEOeSupWhLXicTPCHD7Ndv0 e3xw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=AjKL4JoO; 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 hc33-20020a17090716a100b00713dd68c65csi16661492ejc.818.2022.06.15.12.52.12; Wed, 15 Jun 2022 12:52:13 -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=AjKL4JoO; 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 3D12268B70A; Wed, 15 Jun 2022 22:51:49 +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 D2EA6680105 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=1655322696; bh=4zv04y0XHUzGgMstOC28KORJ/jFb509VLu5Sb8+UOqM=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=AjKL4JoOxxHyTz75F2zNEFQfdMSumxuG3/RdwA1hhia8nrqPoj9klHSen3B9HOF3X DyuBuR142eKhiqtMTbq9HBv5vEZ1JYJf2UMn7IDrVPNR525zIFUQvAs2qIQnYupfqq Rh4OLGQ4oEyrDJ+Tp04G8CBs3YXhfDf2XR9exnHU= 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:36 +0200 (CEST) X-EA-Auth: LWT5Wwo6FBiIkUlUDS6r2Hd7IZszb6x8mq1J9D6V8JIGCxqp1PSUmq0+dTC4LXbFuvfn6TGOPDhNipvfdJC4mudKODRegpEJaKsbNhu/5uE= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 22:51:25 +0300 Message-Id: <20220615195128.15796-2-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 2/5] compat/w32dlfcn.h: Remove MAX_PATH limit and replace LoadLibraryExA with LoadLibraryExW 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: 0EJBWWVIbkBa --- compat/w32dlfcn.h | 95 +++++++++++++++++++++++++++++++++---------- libavcodec/mf_utils.h | 1 + 2 files changed, 74 insertions(+), 22 deletions(-) diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h index 52a94efafb..e4f46c488c 100644 --- a/compat/w32dlfcn.h +++ b/compat/w32dlfcn.h @@ -20,11 +20,35 @@ #define COMPAT_W32DLFCN_H #ifdef _WIN32 +#include #include #include "config.h" -#if (_WIN32_WINNT < 0x0602) || HAVE_WINRT #include "libavutil/wchar_filename.h" -#endif + +static inline wchar_t *get_module_filename(HMODULE module) +{ + wchar_t *path = NULL, *new_path; + const DWORD max_path_size = INT16_MAX + 1; + DWORD path_size = 0, path_len; + + do { + path_size = path_size ? 2 * path_size : MAX_PATH; + new_path = av_realloc_array(path, path_size, sizeof *path); + if (!new_path) { + av_free(path); + return NULL; + } + path = new_path; + path_len = GetModuleFileNameW(module, path, path_size); + } while (path_len && path_size <= max_path_size && path_size <= path_len); + + if (!path_len) { + av_free(path); + return NULL; + } + return path; +} + /** * Safe function used to open dynamic libs. This attempts to improve program security * by removing the current directory from the dll search path. Only dll's found in the @@ -34,29 +58,53 @@ */ static inline HMODULE win32_dlopen(const char *name) { + wchar_t *name_w; + HMODULE module = NULL; + if (utf8towchar(name, &name_w)) + name_w = NULL; #if _WIN32_WINNT < 0x0602 - // Need to check if KB2533623 is available + // On Win7 and earlier we check if KB2533623 is available if (!GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "SetDefaultDllDirectories")) { - HMODULE module = NULL; - wchar_t *path = NULL, *name_w = NULL; - DWORD pathlen; - if (utf8towchar(name, &name_w)) + wchar_t *path = NULL, *new_path; + DWORD pathlen, pathsize, namelen; + if (!name_w) goto exit; - path = (wchar_t *)av_calloc(MAX_PATH, sizeof(wchar_t)); + namelen = wcslen(name_w); // Try local directory first - pathlen = GetModuleFileNameW(NULL, path, MAX_PATH); - pathlen = wcsrchr(path, '\\') - path; - if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH) + path = get_module_filename(NULL); + if (!path) + goto exit; + new_path = wcsrchr(path, '\\'); + if (!new_path) goto exit; - path[pathlen] = '\\'; + pathlen = new_path - path; + pathsize = pathlen + namelen + 2; + new_path = av_realloc_array(path, pathsize, sizeof *path); + if (!new_path) + goto exit; + path = new_path; wcscpy(path + pathlen + 1, name_w); module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (module == NULL) { // Next try System32 directory - pathlen = GetSystemDirectoryW(path, MAX_PATH); - if (pathlen == 0 || pathlen + wcslen(name_w) + 2 > MAX_PATH) + pathlen = GetSystemDirectoryW(path, pathsize); + if (!pathlen) goto exit; - path[pathlen] = '\\'; + // Buffer is not enough in two cases: + // 1. system directory + \ + module name + // 2. system directory even without the module name. + if (pathlen + namelen + 2 > pathsize) { + pathsize = pathlen + namelen + 2; + new_path = av_realloc_array(path, pathsize, sizeof *path); + if (!new_path) + goto exit; + path = new_path; + // Query again to handle the case #2. + pathlen = GetSystemDirectoryW(path, pathsize); + if (!pathlen) + goto exit; + } + path[pathlen] = L'\\'; wcscpy(path + pathlen + 1, name_w); module = LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); } @@ -73,16 +121,19 @@ exit: # define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800 #endif #if HAVE_WINRT - wchar_t *name_w = NULL; - int ret; - if (utf8towchar(name, &name_w)) + if (!name_w) return NULL; - ret = LoadPackagedLibrary(name_w, 0); - av_free(name_w); - return ret; + module = LoadPackagedLibrary(name_w, 0); #else - return LoadLibraryExA(name, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); +#define LOAD_FLAGS (LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32) + /* filename may be be in CP_ACP */ + if (!name_w) + return LoadLibraryExA(name, NULL, LOAD_FLAGS); + module = LoadLibraryExW(name_w, NULL, LOAD_FLAGS); +#undef LOAD_FLAGS #endif + av_free(name_w); + return module; } #define dlopen(name, flags) win32_dlopen(name) #define dlclose FreeLibrary diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h index 3b12344f3e..aebfb9ad21 100644 --- a/libavcodec/mf_utils.h +++ b/libavcodec/mf_utils.h @@ -29,6 +29,7 @@ // mf*.h headers below indirectly include strmif.h.) #include #else +#define NO_DSHOW_STRSAFE #include // Older versions of mingw-w64 need codecapi.h explicitly included, while newer // ones include it implicitly from dshow.h (via uuids.h). From patchwork Wed Jun 15 19:51:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36245 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp552799pzb; Wed, 15 Jun 2022 12:52:24 -0700 (PDT) X-Google-Smtp-Source: AGRyM1ttIWtCgQYhYuf6JZ7mBJyc89ZpmfWt3J+yloRGVzsyumS29Y6FgQ8Fvwgn6YChUtznJU6O X-Received: by 2002:a17:906:3985:b0:70c:a5fe:d4fb with SMTP id h5-20020a170906398500b0070ca5fed4fbmr1344399eje.127.1655322744090; Wed, 15 Jun 2022 12:52:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655322744; cv=none; d=google.com; s=arc-20160816; b=ZoQ5gyaNt5zNph/JlsuGrWMrIhTWquP3kMCatCgaNVRhbg1NGy03Mnq38O0bexOlrq 1MmW4WoPwAuZuYuJhTXKvDI2yuscc+evPxGOH41ttFtlJUOV70Ctf/zQOH2JrM4Jr+KI DtFE6D4ovk0cz5AYVaUU9xHaOMrwcnFS/d2NZaixYQJ9rmO1YjYejiEIgSJEK6E6Vp2X jAyBUhW/9GNdQ5yf6bF+5z64A7Alc0/maLLmujixJEYYwHtm0bcy89GFPpnD5MnA5OVA syftI9U+P9B5hvjKKz1NOedfwsuVV7vSqPL5tZYy0dCB9N7B8E0ArQ4f6Kbvk7O3ZxKr WnDA== 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=QkjFU6pDv/L831pKmfY73N4D2BxwpxFTk1Kw6y+uHjs=; b=YkJU5A5sAa649vYs1Rp4WGBzgDaQyXXc36MOkoFiHqQIGyPG5Opu+Tt+keyK7UjvMm ygp354COBXQ4iptX5BwZKhn9veDXZ427FljiKCykJkpdDadrw9D2nXdYhMDT+6p57G7J 8J+ZFkZYZXNzoaUZFnYnPpxRect49Sas9svjFANV4kOY+8X2Gx8RicvqDq2R6G8CVQh3 25j/AqiSWNQO8xj0q5RSmEJeddKbqDDCD0G3LM/3xV79UyJnn1fGheclmMLCj8iZzjns bsYcWT68+nyqCYH04Qb1AynId/+cAs646w9MRzJv80ErxdikK2gKwoBhhKYg7jZdHtPM MuGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=Lug41mUn; 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 l10-20020a170906794a00b00711caf7c68bsi17045505ejo.959.2022.06.15.12.52.23; Wed, 15 Jun 2022 12:52:24 -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=Lug41mUn; 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 51F2268B6E4; Wed, 15 Jun 2022 22:51:50 +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 D86A268B63F 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=1655322697; bh=URvC6B6PREZgBUbfwUqQ5D7xKiQpxPZ2NFtf8pxmQhY=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=Lug41mUn2PtwtFR+NFjV/qb/vQ1zFHvS1ZgtU9N5IaSgI0gUL68W9wJlp6jn2ap2i 4T2TjVnD/hETJBsNk0Od00PmwdpMW+F8hhXLUbqwMAbsoF+fkq+QQuSOgCTsNnKGwQ /qPmCVo/Dye3S4JthD6DZVEeNKiWB8vHn197GPVM= 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:37 +0200 (CEST) X-EA-Auth: U1Jd4CJbIEYmFEGiYbNfq13c9oPUBwwAn9qiqfBPJ3AbVkiwaFKa2SQ/39xHQqUtLUWErBIG7R2rhfjDKrA61Lrmnmh+oqMK+mtHuC2ZyVI= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 22:51:26 +0300 Message-Id: <20220615195128.15796-3-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 3/5] fftools: Remove MAX_PATH limit and switch to UTF-8 versions of fopen() and 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: 5YJ9vWbSMUJi --- fftools/cmdutils.c | 53 +++++++++++++++++++++++++++++++++----------- fftools/ffmpeg_opt.c | 9 ++++++-- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c index 5d7cdc3e10..5e7fbbe2ee 100644 --- a/fftools/cmdutils.c +++ b/fftools/cmdutils.c @@ -39,6 +39,7 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/display.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/mathematics.h" #include "libavutil/imgutils.h" #include "libavutil/libm.h" @@ -47,9 +48,11 @@ #include "libavutil/dict.h" #include "libavutil/opt.h" #include "cmdutils.h" +#include "fopen_utf8.h" #include "opt_common.h" #ifdef _WIN32 #include +#include "compat/w32dlfcn.h" #endif AVDictionary *sws_dict; @@ -465,7 +468,7 @@ static void check_options(const OptionDef *po) void parse_loglevel(int argc, char **argv, const OptionDef *options) { int idx = locate_option(argc, argv, options, "loglevel"); - const char *env; + char *env; check_options(options); @@ -474,7 +477,8 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options) if (idx && argv[idx + 1]) opt_loglevel(NULL, "loglevel", argv[idx + 1]); idx = locate_option(argc, argv, options, "report"); - if ((env = getenv("FFREPORT")) || idx) { + env = getenv_utf8("FFREPORT"); + if (env || idx) { FILE *report_file = NULL; init_report(env, &report_file); if (report_file) { @@ -487,6 +491,7 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options) fflush(report_file); } } + av_free(env); idx = locate_option(argc, argv, options, "hide_banner"); if (idx) hide_banner = 1; @@ -812,28 +817,45 @@ FILE *get_preset_file(char *filename, size_t filename_size, { FILE *f = NULL; int i; - const char *base[3] = { getenv("FFMPEG_DATADIR"), - getenv("HOME"), +#if HAVE_GETMODULEHANDLE && defined(_WIN32) + char *datadir = NULL; +#endif + char *env_home = getenv_utf8("HOME"); + char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR"); + const char *base[3] = { env_home, + env_ffmpeg_datadir, FFMPEG_DATADIR, }; if (is_path) { av_strlcpy(filename, preset_name, filename_size); - f = fopen(filename, "r"); + f = fopen_utf8(filename, "r"); } else { #if HAVE_GETMODULEHANDLE && defined(_WIN32) - char datadir[MAX_PATH], *ls; + wchar_t *datadir_w = get_module_filename(NULL); base[2] = NULL; - if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1)) + if (wchartoutf8(datadir_w, &datadir)) + datadir = NULL; + av_free(datadir_w); + + if (datadir) { - for (ls = datadir; ls < datadir + strlen(datadir); ls++) + char *ls; + for (ls = datadir; *ls; ls++) if (*ls == '\\') *ls = '/'; if (ls = strrchr(datadir, '/')) { - *ls = 0; - strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir)); - base[2] = datadir; + ptrdiff_t datadir_len = ls - datadir; + size_t desired_size = datadir_len + strlen("/ffpresets") + 1; + char *new_datadir = av_realloc_array( + datadir, desired_size, sizeof *datadir); + if (new_datadir) { + datadir = new_datadir; + datadir[datadir_len] = 0; + strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len); + base[2] = datadir; + } } } #endif @@ -842,17 +864,22 @@ FILE *get_preset_file(char *filename, size_t filename_size, continue; snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", preset_name); - f = fopen(filename, "r"); + f = fopen_utf8(filename, "r"); if (!f && codec_name) { snprintf(filename, filename_size, "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, preset_name); - f = fopen(filename, "r"); + f = fopen_utf8(filename, "r"); } } } +#if HAVE_GETMODULEHANDLE && defined(_WIN32) + av_free(datadir); +#endif + av_free(env_ffmpeg_datadir); + av_free(env_home); return f; } diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 398067da96..f49acf6ad0 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -44,6 +44,7 @@ #include "libavutil/avutil.h" #include "libavutil/bprint.h" #include "libavutil/channel_layout.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/intreadwrite.h" #include "libavutil/fifo.h" #include "libavutil/mathematics.h" @@ -1402,8 +1403,10 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV { int i, ret = -1; char filename[1000]; - const char *base[3] = { getenv("AVCONV_DATADIR"), - getenv("HOME"), + char *env_avconv_datadir = getenv_utf8("AVCONV_DATADIR"); + char *env_home = getenv_utf8("HOME"); + const char *base[3] = { env_avconv_datadir, + env_home, AVCONV_DATADIR, }; @@ -1421,6 +1424,8 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL); } } + av_free(env_home); + av_free(env_avconv_datadir); return ret; } 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); From patchwork Wed Jun 15 19:51:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36242 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp552611pzb; Wed, 15 Jun 2022 12:51:52 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s1FdoCSFuVpnXDO2e6UtzjICxtTAXK1JkLyFjhW2nN0+nIdsPPUzj+EiHINe8LOfHC8yqX X-Received: by 2002:a05:6402:1f0d:b0:435:1ff1:9a48 with SMTP id b13-20020a0564021f0d00b004351ff19a48mr1835251edb.270.1655322712078; Wed, 15 Jun 2022 12:51:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655322712; cv=none; d=google.com; s=arc-20160816; b=w8oK56Il5Fj5EuTFQgfdx8DEvcJt0jdnyw5JFgYZClHPJBITesEMDPdJMqnkaogvl1 SoajV66Bt0t9Rubud07aG5EZXt9RkVIadHb/ZGE0cWlHGWcW4Lop5mXQmk8hLbCJTNIF PI9zX+n1lJ1EApr3xJxbnO1rdeCSGfUs7FzFPlNBdGQfr/p6DgnxLwLVNSR13wwHywqm ttYrqBjtGcxMiwvsCLwXs+eAmGQ+CkzcS5wCAnl446/jDWRaDenqS5w836wTfeBLxt8x rGRoZiqGK1TmKfDi7dq5nKZY+7Ci+/cRdo6jBZc8rmLeKFOvvlkDlayXmjBFgOTE+Hn0 w2IQ== 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=wck5Gh3tZJ45YiVREwz/p0oiAQ/bs6B/1JICiOazkZ8=; b=QzPe8iOqVqqIdQdVgF2Bx2AbOzSZn5ZOUpS0Fuyjx5dO77pRhTBXyFN75HXY8wsAru bSUI5cppOVRwik8Za/IdMg/cNNV+/DC3mHmtzFjsOje7yfmlE+wZ5LU5ej+a4xcLyV8+ Um42WIwbV4UsNpVgBO1IG8c3K6mTBLJbNeK1RqA/Z9ZF8Rmbhj+KzSL7OOoa175LR7lh Y+Zc7L3sc64yuZU7JQfimDrsI3/rt+aFRm8g8wBl/Q954siynUOdPelI8fwe2/YuOFat yy9sYyU06anFHLiXpudxjz07QcstFbE+nw9yvrh5Sz4xV1YWZHZdSoDVGtH84b2XlSJ+ kY7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=TD+Wkc6e; 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 10-20020a170906024a00b00711610f8ebfsi14805171ejl.185.2022.06.15.12.51.50; Wed, 15 Jun 2022 12:51:52 -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=TD+Wkc6e; 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 E2BB768B6E1; Wed, 15 Jun 2022 22:51:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from msg-6.mailo.com (ip-16.mailobj.net [213.182.54.16]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DB30668B679 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=1655322699; bh=p9jxFt4rVMw7lLn6uKQfLHnRCrr8GugwXB91pqjkC1Q=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=TD+Wkc6euXFNcDFSdkI3q3SHM3Xg/rZODTcyi/dB95h0GeC6aMcOH8iPCBreFcvkP J4k3OLmrqNCOzs4Ktr/wRK9CqXnhqTR9PuAWn7AZQkboux4RkNJl+Pgg8rRBOhLWdn gQ9IT3MqrQwvcNcRhPDhoUZXNdnzkTwWKJNmt+hM= 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:39 +0200 (CEST) X-EA-Auth: P5DeovZlf/VBLwo1pVDRefi3YvAMqRcpYbcgRtHsyrj9LuBo5HxzGlehXZRJLP7Hmw72T8ubHEgGqx8LNqdz/IG47eHcY2JNni2sxcv6Cqw= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 22:51:28 +0300 Message-Id: <20220615195128.15796-5-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 5/5] libavfilter/vf_frei0r.c: 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: YEIwoN6Zw79L --- libavfilter/vf_frei0r.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c index f11ae6e55c..727e96561a 100644 --- a/libavfilter/vf_frei0r.c +++ b/libavfilter/vf_frei0r.c @@ -31,6 +31,7 @@ #include "libavutil/avstring.h" #include "libavutil/common.h" #include "libavutil/eval.h" +#include "libavutil/getenv_utf8.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" #include "libavutil/mathematics.h" @@ -204,7 +205,7 @@ static av_cold int frei0r_init(AVFilterContext *ctx, } /* see: http://frei0r.dyne.org/codedoc/html/group__pluglocations.html */ - if ((path = av_strdup(getenv("FREI0R_PATH")))) { + if ((path = getenv_utf8("FREI0R_PATH"))) { #ifdef _WIN32 const char *separator = ";"; #else @@ -231,12 +232,17 @@ static av_cold int frei0r_init(AVFilterContext *ctx, if (ret < 0) return ret; } - if (!s->dl_handle && (path = getenv("HOME"))) { + if (!s->dl_handle && (path = getenv_utf8("HOME"))) { char *prefix = av_asprintf("%s/.frei0r-1/lib/", path); - if (!prefix) - return AVERROR(ENOMEM); + if (!prefix) { + ret = AVERROR(ENOMEM); + goto home_path_end; + } ret = load_path(ctx, &s->dl_handle, prefix, dl_name); av_free(prefix); + + home_path_end: + av_free(path); if (ret < 0) return ret; }