From patchwork Mon Jun 13 16:26:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36196 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp586679pzb; Mon, 13 Jun 2022 09:26:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyjgHezc9wZSavX0TfV/y5pGaV6LK2+Ew/fcIBYkGKUlo19w4GQQQVnLtduLGFmuPGUpSE+ X-Received: by 2002:a17:906:482:b0:6fe:86fa:a5c5 with SMTP id f2-20020a170906048200b006fe86faa5c5mr588599eja.28.1655137611956; Mon, 13 Jun 2022 09:26:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655137611; cv=none; d=google.com; s=arc-20160816; b=cD+39QakHFLCbHG9vZQW0r4xISWdBP+qv+c+pmt34MWDHoID+ypnkuJSfhvWFuR2kL G4ictmmCpWESYzie5qIa9CsRaRsx76lxocEbloMDuNzLbT90FuYIm28kPJHbig6hwJUo s0tTqJ2iN0qcXVyWkRrADCpMqERTw01OSxdIUSRoWa2gNPhsjAIafgAMrN9pmVZP8DXz S8UZQ2W8wU/wWOQ+MYPqSAHDYa4ponMzVHDzmAhqnkF5PFCtWNE+WVaebsHilSWheURB WA73RETmEzti0kDCgOqu0jADkhD79Em9kyrT9bNo96Gya++WNA5oxpTwyIAU0OtxBwPK nqJQ== 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=wttcUeeS2uOqiH4ZVmmkkD6VSiG11AsRfDNnckuS9D8=; b=evUvi1Fohtpu99ZbePrF1E0svjawhV4Fey+yq6Sv6BAg53t1OqQhzi3MvzfXbesChv ysdaYxDGzMKbQHicgHFYbVGGnDFrFsdVdBz4HQTNNz3DLX0NpnuAoFUYOMa+S3Zs7K+O uLWKx6BtqMCE53WAc3r28Cc4aHlQfUq0hzqAz4DrIbJVxT4VL2Pv0lrxMWDKTHL9agAy o+fjSLip7jHbgP7H9KzZgP7qLVsV5wGn1Z2/b07vzmUQtsqTNSmnFC0QHPnYk4ONUKrU WhaZ0VZ+wiSboYZs0a4a5SCL+nvduOhyJqJ9XrzXlwbPcXxPQZ5eD9y2yp6N0+tbZyo6 U1rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=UZVHLjq3; 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 nd17-20020a170907629100b006f42a32ebcdsi9473547ejc.753.2022.06.13.09.26.50; Mon, 13 Jun 2022 09:26:51 -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=UZVHLjq3; 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 4674B68B5E4; Mon, 13 Jun 2022 19:26:47 +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 B6EFE68B58E for ; Mon, 13 Jun 2022 19:26:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655137596; bh=77Wb4gh4Cv4bixNKcMI8kRLP0s4QXhB/Hm6SDJJiq6A=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:MIME-Version: Content-Transfer-Encoding; b=UZVHLjq3YdkVx69GQJbR2J4txklEkcLlFQTPnM0z4SiewzKW7EE0JnPtxY3Vx3Gjr ka49joTBQyQ1PRLybgo63NgdaBajobpBdn2r2HApu/fVj7K1IVtJloKBVQGdfMTBrp BYaQ3S6029LIGVGrWmrb++N3BH4pURyzSgQZmCrk= Received: by b-1.in.mailobj.net [192.168.90.11] with ESMTP via ip-206.mailobj.net [213.182.55.206] Mon, 13 Jun 2022 18:26:35 +0200 (CEST) X-EA-Auth: FRgBwIs9K0BKuprg2Ldc5MxkPqLTa78B1+lkkV47urFD8JK4zEivJTnWQTKd8owGGdE+btwdpRfUXcBqnRRglvOngZq3EsxacSFwHNk/HqI= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jun 2022 19:26:22 +0300 Message-Id: <20220613162626.11541-1-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v14 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: tvTlysW13JF6 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. --- libavutil/getenv_utf8.h | 63 ++++++++++++++++++++++++++++++++++++++ libavutil/wchar_filename.h | 51 ++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 libavutil/getenv_utf8.h diff --git a/libavutil/getenv_utf8.h b/libavutil/getenv_utf8.h new file mode 100644 index 0000000000..2c48a36355 --- /dev/null +++ b/libavutil/getenv_utf8.h @@ -0,0 +1,63 @@ +/* + * 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 _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 + +#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 Mon Jun 13 16:26:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nil Admirari X-Patchwork-Id: 36197 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp586759pzb; Mon, 13 Jun 2022 09:27:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwq5iCyaA04Bbqyf4IViuLpYLKtqUsqxtNvL7js2a3bb4G6kPl6S87MQPgt/OLCVcXXkG82 X-Received: by 2002:a17:907:6e13:b0:711:c722:4fc with SMTP id sd19-20020a1709076e1300b00711c72204fcmr550446ejc.253.1655137623741; Mon, 13 Jun 2022 09:27:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655137623; cv=none; d=google.com; s=arc-20160816; b=bc8TNs3FNFyqRqW7WS/BUb1LkkpdEUHwExicSKffncqRhrcEc10u6PDt/i4wB8IxI2 p9BdcvSxBQE0u1hJmxB/kmh3Qrusic+XePDevneS5pdoII/0i91BuQg+3Y+ut2764ZIF cr8O/kjzEW99x3CGgS9HlyJ4I0ytW9HUlwsl0yoWV9QBalQOS1Kbja2n5TF5WO4ewUhT vs6L0Dp8BQkqgcI1jdMCUBDVldg08JUHxavGdSAbh5Lj5Jlv1xG7uXcLl2Kv2Tc8g44n AP+bUSMG27AycVrVJS3krKZty27nAC/wt2PhuEHryXWCslmn/+N0TMIaSKMrn83C63a1 Wyig== 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=KLvjl91dfyl/d5rRJT51EQPXBuP+rDjxykG1xSIgJGg=; b=fna5mfRQZNsSMDQJWkaw1JtaRL5OOBaAMl0C4c07jHaF9oa2RF9SVvBQX3CrjkXjUI S/nTrFBxAxBEmeqrMoLnnfGtwGTKUAmZK/moHcTaovR3yhUfW6yX05qPUkAOhyplhQrK OtQ5eGJylL5LyFy046BX9RR9Mq5H4pKl2T6/KCpaTUuX1wuu+mZpSAs/wnmQRYgCnJLj EY7okTokDb4P/Wu5brODMjYCIiMQZqOnKO/qFYNyWUrE0OmFlQyP/HuGUkW0VXOvHRDI YtOKg4kYeIPAkVuMCYdcIFFb6gx5U7y5cbHXk4qumS0d185DR0J/fd1pfnxNGgpmfjVC elVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b="bAoG51h/"; 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 ga8-20020a170906b84800b006ff2f915b77si7423293ejb.578.2022.06.13.09.27.03; Mon, 13 Jun 2022 09:27:03 -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="bAoG51h/"; 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 7DD1768B33F; Mon, 13 Jun 2022 19:26:48 +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 B3FDD68B26D for ; Mon, 13 Jun 2022 19:26:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655137596; bh=CQPxi6YKcoCHlQtTdtK/pyGlKMlAqni0NSJHvLISoCs=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=bAoG51h/FJtMuy6KjXObl6KQLI77nxY8rMUZiteNTFLLkxf8Kghb/fGdJP6D/tWoL 3im8qmm3xywTvRpMqCH7CUoogPU3wTH4pE9ZcEcAsD20gdS2vc8+Qho2uZImuLKAg7 MM9ETLpvQ9YaST7lahtkQ7SII6aOfRgv+E/cukl0= Received: by b-1.in.mailobj.net [192.168.90.11] with ESMTP via ip-206.mailobj.net [213.182.55.206] Mon, 13 Jun 2022 18:26:36 +0200 (CEST) X-EA-Auth: +qnQKqribpQzEXASyhz+UhviMMbu6lD8l8OwgcxKEk0yxXjUGzzQ/n1s4yA5Pwjbe7Yp2s4HjnG/TGnn9TRSMgOPHdWzAm7HtYcPvX00QkQ= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jun 2022 19:26:23 +0300 Message-Id: <20220613162626.11541-2-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220613162626.11541-1-nil-admirari@mailo.com> References: <20220613162626.11541-1-nil-admirari@mailo.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v14 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: DQOko2JzbR3U --- compat/w32dlfcn.h | 80 ++++++++++++++++++++++++++++++++++--------- libavcodec/mf_utils.h | 1 + 2 files changed, 65 insertions(+), 16 deletions(-) diff --git a/compat/w32dlfcn.h b/compat/w32dlfcn.h index 52a94efafb..e49d3841aa 100644 --- a/compat/w32dlfcn.h +++ b/compat/w32dlfcn.h @@ -22,9 +22,31 @@ #ifdef _WIN32 #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; + 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 <= 32768 && 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 +56,53 @@ */ static inline HMODULE win32_dlopen(const char *name) { + wchar_t *name_w = NULL; + if (utf8towchar(name, &name_w)) + name_w = NULL; #if _WIN32_WINNT < 0x0602 // Need to 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; - path[pathlen] = '\\'; + new_path = wcsrchr(path, '\\'); + if (!new_path) + goto exit; + 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,15 +119,17 @@ 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; #else - return LoadLibraryExA(name, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); + /* filename may be be in CP_ACP */ + if (!name_w) + return LoadLibraryExA(name, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); + return LoadLibraryExW(name_w, NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); #endif } #define dlopen(name, flags) win32_dlopen(name) 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 Mon Jun 13 16:26: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: 36200 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp587046pzb; Mon, 13 Jun 2022 09:27:39 -0700 (PDT) X-Google-Smtp-Source: AGRyM1uFbAoBSFbBDW3YLBLjqU5ESeJpIO5OZUGmD0Sx0H6ygJRN5nf1H9Uqg2T72WRiWhZzGq++ X-Received: by 2002:a17:907:6289:b0:6e0:eb0c:8ee7 with SMTP id nd9-20020a170907628900b006e0eb0c8ee7mr524457ejc.245.1655137658756; Mon, 13 Jun 2022 09:27:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655137658; cv=none; d=google.com; s=arc-20160816; b=s/rUPWrH16i09Gv0hZ4fBaaqgBM6FBR7oA2KK0uX/YWV5iQ34Eq4Q5T8XT0DxXCSUx 3JQAbf4al0fbdbvOmSVNtJfO9u6cYoQqiXYg/vezDtts+OnXSDAVYx1wgRukC6A+ynGL EA3DmpT7FfUDGqiVvbJJbUOnQ+92EELE+fZ4tJIKi08S1QZJtfrSk9m6uCD+by7r2P4r tgYpBbfuHnGIQBlPYooYc7MMHpbp1srkwfyxZQKaWInQ4p/Bb9ZuPrYL0IwODIeuX8sp Apazm/RU7iea2FG1PA0/wn1UHKFVFIp633Gij47sQDmJ4XXSDxp87szusEFYge5ul+xQ v4xg== 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=EQi4xJN7mX4kw5hd6+ESRl+WbfdaVAoer3lpyMA/q3qsXxg/8wqAbINPIVMS5f8AQF ksu9TThN+BzoXOuUWHgRB0U71A9xRu6QRHE49xjdzsyg75KuMRn7b+5ppZo+9jsRiVaF I28DQubssO2MsvKJ5WKEh6WJAYsva6cYMk+ioFFwi45Jbzhuhmfs0EVh+g2iMaBUsFCJ vMM4ASUsOB71k53Hul8K4He/aFUBBXM9VOIcF/z+3kMMn2CjSeCKDIt3edVPZowMN1ma 2HzMWWl43VR6HFr7Q5eDA7iGqo2uQpuXxPMid21cNxsDmignv+t0sTfwZAMRU+2Tx2Pc 3BFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=FOfcTZuq; 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 sh13-20020a1709076e8d00b006ff1a60c3ebsi6633947ejc.821.2022.06.13.09.27.38; Mon, 13 Jun 2022 09:27:38 -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=FOfcTZuq; 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 B667D68B611; Mon, 13 Jun 2022 19:26:51 +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 BFAE768B5B3 for ; Mon, 13 Jun 2022 19:26:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655137597; bh=URvC6B6PREZgBUbfwUqQ5D7xKiQpxPZ2NFtf8pxmQhY=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=FOfcTZuq/znwlJM+FSuFdheMIPLRsWGuX3XFSbkqFo6X+1fyCgbOPzFv1nKHfr8Ax QR9lm3OkzBwvauFfNdQy5E7QG7TSB78nFvdaqMTya7j13TwCCVNt0jVixqXHl7xkQl PhKbV187nfDvUcFuQFug0Ht5HuMCWL81+/VydnC0= Received: by b-1.in.mailobj.net [192.168.90.11] with ESMTP via ip-206.mailobj.net [213.182.55.206] Mon, 13 Jun 2022 18:26:37 +0200 (CEST) X-EA-Auth: G/jBria6lqUi3DMP32sn8vwK2rnCympYMpLne6OtXQS/OCpwgVB21ktcyM/x8GSIJc8UK95LjDmYBbgl3opXS4nR9MXbI5kZRA8q1Fp2ahA= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jun 2022 19:26:24 +0300 Message-Id: <20220613162626.11541-3-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220613162626.11541-1-nil-admirari@mailo.com> References: <20220613162626.11541-1-nil-admirari@mailo.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v14 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: hzI5w3fbEqKb --- 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 Mon Jun 13 16:26: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: 36199 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp586925pzb; Mon, 13 Jun 2022 09:27:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZz9edY0IAsyyc8Vf0fKlDXpfRI8YosWbd+nCCzdslRpvuDafVJwNTWrr0c/4hvPX1QtpX X-Received: by 2002:a17:907:3f97:b0:711:d61d:df9 with SMTP id hr23-20020a1709073f9700b00711d61d0df9mr576847ejc.644.1655137646286; Mon, 13 Jun 2022 09:27:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655137646; cv=none; d=google.com; s=arc-20160816; b=O16dXOJLuAz4zWUBueN3qbdnqkTbIhQd72ioMGRNnhq6rbmiIsS2/Rg9XLUxTai3lO GCMRhw75rfnPMdAgOSGEBDvUOBfCQfofs1y8cEENq967kyz+0aSOVfCMN1TaDT6QOfJx qjmKlr2VBAFu4ACpKB4hEOtinVGVUcJD+ZqU9Rg7+HnykzW62dzz/DQ4WeyDJyxlq84v jHNrjohAgRRhlFKLw2MQLuWgSISD6Kt1fe+JZPFu0HFg567CSUXitHjAjpY4Dl1AlZX9 MPCoR4eigFBIj5FjsTk9XfizXNPSMLhl14upBDhyUntWyriNbqOYNO8kO+S3xbzsK3fY Lfcg== 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=RPu0YbHhKXOoz6Taqgt+JHvOFfZqP8jvGes04EThYapv0wKhAcMU073I0M4nYTtZ24 l4kSOLAYXvADrPfPgn1S0eAC3PUSblrjHEM1RF18lKMsWNZJ3hyJ34TobkDtlx7zxO0Y Laf+uSYchQHtQQOv5Ro7aswlEXxZcugZCh7lWUdWUqsWz7FYTj77q2C3Q2uwOJJzLmlp r7UZKXa3Vml9dst4/k39rJijzn5zn5Tb1cYYsoEqi9NFWnOjtbcyvLD3aT0JFX62I89b 59NCDzJnpFzWYMfkxXODSQyPqfixl1U0lx+qO58CzMCxN1je5yE8JWlPpyCU6x0fr+zM 8xKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b="JmJ/E0ZT"; 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 cs16-20020a170906dc9000b006f3d2558d4bsi9198189ejc.496.2022.06.13.09.27.25; Mon, 13 Jun 2022 09:27:26 -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="JmJ/E0ZT"; 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 A96D168B596; Mon, 13 Jun 2022 19:26: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 BA05F68B596 for ; Mon, 13 Jun 2022 19:26:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655137598; 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=JmJ/E0ZTkCoceq0K+qO17AsCmudtYVQJDmH4z354hKKzrv+OqIQ+Ef3cZbo+DwZiP YZ4E7CJwTvJ4U2zICTmawi2J9qHldqq6+PYI83AwQqbK2mxirfuWabvAmOgVI2MGX4 uPa2jMHJUxZXMePubXpK0T24mjoOcpIX0IAhuXqo= Received: by b-1.in.mailobj.net [192.168.90.11] with ESMTP via ip-206.mailobj.net [213.182.55.206] Mon, 13 Jun 2022 18:26:38 +0200 (CEST) X-EA-Auth: 6iKxVXPtc7Nh45R7T0ob+TS/BieFA0C6JelvKXA0kSXLP4qpgBnJ1MrFedn67d+b5xHmbfK1AZguhko2+RJXsUtVE6e3gnt+WZCtWg+xlQc= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jun 2022 19:26:25 +0300 Message-Id: <20220613162626.11541-4-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220613162626.11541-1-nil-admirari@mailo.com> References: <20220613162626.11541-1-nil-admirari@mailo.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v14 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: tb+qOa61EpzJ 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 Mon Jun 13 16:26: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: 36198 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp586842pzb; Mon, 13 Jun 2022 09:27:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzsWwCIP3EPd6j6MbyxnR9uUwRvQn5RD++sTdQmiLYNQO4MXjCwWivhbocAe18s8QZ7Yjvw X-Received: by 2002:a17:906:739a:b0:713:3ac7:976f with SMTP id f26-20020a170906739a00b007133ac7976fmr588205ejl.22.1655137634738; Mon, 13 Jun 2022 09:27:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655137634; cv=none; d=google.com; s=arc-20160816; b=E3Dy3X+7GGqUQAJEhdKt8Cp8AX7QmjsYlBeupGFPEyFs7ncb3gspBUJLhWN4AmR7k/ 6A091eMwXLzhobEg5Ge78HWQJykmulLELgff5DkvLPmpY6j2s8joMOcY4cb39joCzHwd 1LcUCWzE1Y82eZ/SVElIkBzSYnjUaLLbCZpgsb7laFza2hhfVhGIrcmR/iyOIh+c+HPL s68nN5seuhytJljXHCwHJ0Kyx0r9pIsV2Vm5CkCRYe8wLSy0H8m5wLRXtCQFij1rw30j QC3bA24HYD2p+drjYW1rQmIRt/xMjqC3Rr4DXjeyCN1eW8HSguWLkUgdMI17Ms6l6uhY lb3Q== 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=NSYpHhyPH1hBFrK1wT/i11HCVYTQtJBi4sk7R5Yecuu8bS0EBxE5ZvsmLGnN+5QNlo Vhc4dKFzuKy/UIrUlpUmLVvN6EibifBL0ARmNiFCqjvWx4F/KgjTBT9WSVWq7RN5aKuu 4R+8JbEfNds0ODyzDFIV7Z28rcwl5LjjTzpURh7wCcJJkZf6ADynri1bKc8baufw9YhI klB0DU1IHg4UV8s+PZoXz9Pqg1hArLo/axtOaA1ssjZgnIMcV31izd9akP6RRZM/hybF p7Iajx7Owv8FtwTtjDB6wHnzF45uHmOs6Wz7RGlX0KJcCou6YWZdYlLxndAluiWH2FVM p2QA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@mailo.com header.s=mailo header.b=O1MwG4a7; 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 w18-20020a05640234d200b0043167ed96dcsi9913707edc.8.2022.06.13.09.27.14; Mon, 13 Jun 2022 09:27:14 -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=O1MwG4a7; 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 A1EEE68B5FB; Mon, 13 Jun 2022 19:26:49 +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 BCDA468B5B0 for ; Mon, 13 Jun 2022 19:26:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1655137599; bh=p9jxFt4rVMw7lLn6uKQfLHnRCrr8GugwXB91pqjkC1Q=; h=X-EA-Auth:From:To:Subject:Date:Message-Id:X-Mailer:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding; b=O1MwG4a73ahB0V5/eIAvH5TuIAefYTpNw7axDz0559ExklAs9aNg9xMbDfuUi2YHx uk3u2WWUQObEufwKFUVZQS2vZkr1g/SwSvRyl71d0+0ni1AZjmAPbgHufIrTbobyBi hDKiLuQuyotN1cSF7spOPR0tfYboVVsVrd2hX8ZM= Received: by b-1.in.mailobj.net [192.168.90.11] with ESMTP via ip-206.mailobj.net [213.182.55.206] Mon, 13 Jun 2022 18:26:39 +0200 (CEST) X-EA-Auth: XSp3GX+JTWu+98ThkHnz7Tk/JBw2VdzjsiS+QXu/jZXsc8kNdMlf1sZEw46HqUf7+O1b+IzES87S70GrBdQLRVZwlZft/yLoqaR7lxN7iG8= From: Nil Admirari To: ffmpeg-devel@ffmpeg.org Date: Mon, 13 Jun 2022 19:26:26 +0300 Message-Id: <20220613162626.11541-5-nil-admirari@mailo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220613162626.11541-1-nil-admirari@mailo.com> References: <20220613162626.11541-1-nil-admirari@mailo.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v14 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: SXP6SefifRww --- 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; }