← Commit list

18b9429313

Viktor Szakats
Viktor Szakats
2025-11-21
SUCCESS Duration: 151s

Subject

curlx: replace `mbstowcs`/`wcstombs` with `_s` counterparts (Windows)

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

lib/curl_setup.h+1 -2
@@ -97,8 +97,7 @@
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS /* for __sys_errlist, __sys_nerr, _open(),
_wfopen(), _wopen(), fopen(), freopen(),
- getenv(), gmtime(), mbstowcs(), sprintf(),
- strcpy(), wcstombs(),
+ getenv(), gmtime(), sprintf(), strcpy(),
in tests: localtime(), open(), sscanf() */
#endif
#endif /* _MSC_VER */
lib/curlx/fopen.c+12 -10
@@ -97,15 +97,16 @@ static bool fix_excessive_path(const TCHAR *in, TCHAR **out)
#ifndef _UNICODE
/* convert multibyte input to unicode */
- needed = mbstowcs(NULL, in, 0);
- if(needed == (size_t)-1 || needed >= max_path_len)
+ if(mbstowcs_s(&needed, NULL, 0, in, 0))
+ goto cleanup;
+ if(!needed || needed >= max_path_len)
goto cleanup;
- ++needed; /* for NUL */
ibuf = (malloc)(needed * sizeof(wchar_t));
if(!ibuf)
goto cleanup;
- count = mbstowcs(ibuf, in, needed);
- if(count == (size_t)-1 || count >= needed)
+ if(mbstowcs_s(&count, ibuf, needed, in, needed - 1))
+ goto cleanup;
+ if(count != needed)
goto cleanup;
in_w = ibuf;
#else
@@ -193,15 +194,16 @@ static bool fix_excessive_path(const TCHAR *in, TCHAR **out)
#ifndef _UNICODE
/* convert unicode full path to multibyte output */
- needed = wcstombs(NULL, fbuf, 0);
- if(needed == (size_t)-1 || needed >= max_path_len)
+ if(wcstombs_s(&needed, NULL, 0, fbuf, 0))
+ goto cleanup;
+ if(!needed || needed >= max_path_len)
goto cleanup;
- ++needed; /* for NUL */
obuf = (malloc)(needed);
if(!obuf)
goto cleanup;
- count = wcstombs(obuf, fbuf, needed);
- if(count == (size_t)-1 || count >= needed)
+ if(wcstombs_s(&count, obuf, needed, fbuf, needed - 1))
+ goto cleanup;
+ if(count != needed)
goto cleanup;
*out = obuf;
obuf = NULL;
lib/curlx/winapi.c+13 -17
@@ -52,6 +52,7 @@ const char *curlx_get_winapi_error(DWORD err, char *buf, size_t buflen)
{
char *p;
wchar_t wbuf[256];
+ DWORD wlen;
if(!buflen)
return NULL;
@@ -62,23 +63,18 @@ const char *curlx_get_winapi_error(DWORD err, char *buf, size_t buflen)
/* We return the local codepage version of the error string because if it is
output to the user's terminal it will likely be with functions which
expect the local codepage (eg fprintf, failf, infof). */
- if(FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
- LANG_NEUTRAL, wbuf, CURL_ARRAYSIZE(wbuf), NULL)) {
- size_t written = wcstombs(buf, wbuf, buflen - 1);
- if(written != (size_t)-1)
- buf[written] = '\0';
- else
- *buf = '\0';
- }
-
- /* Truncate multiple lines */
- p = strchr(buf, '\n');
- if(p) {
- if(p > buf && *(p-1) == '\r')
- *(p-1) = '\0';
- else
- *p = '\0';
+ wlen = FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, wbuf, CURL_ARRAYSIZE(wbuf), NULL);
+ if(wlen && !wcstombs_s(NULL, buf, buflen, wbuf, wlen)) {
+ /* Truncate multiple lines */
+ p = strchr(buf, '\n');
+ if(p) {
+ if(p > buf && *(p-1) == '\r')
+ *(p-1) = '\0';
+ else
+ *p = '\0';
+ }
}
return *buf ? buf : NULL;
scripts/checksrc.pl+2 -0
@@ -86,6 +86,8 @@ my %banfunc = (
"wcsdup" => 1,
"wcscpy" => 1,
"wcsncpy" => 1,
+ "mbstowcs" => 1,
+ "wcstombs" => 1,
"LoadLibrary" => 1,
"LoadLibraryA" => 1,
"LoadLibraryW" => 1,