-- v3: msvcrt: fix error handling for strcpy_s msvcrt: fix error handling for strcat_s msvcrt: Add _mbsinc_l implementation. msvcrt: Add _ismbcsymbol_l implementation. msvcrt: fix error handling for _wgetcwd msvcrt: fix error handling for _getcwd
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/dir.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index 91aaaf5ff18..97db409bb60 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -790,19 +790,23 @@ char* CDECL _getcwd(char * buf, int size) int dir_len = GetCurrentDirectoryA(MAX_PATH,dir);
if (dir_len < 1) - return NULL; /* FIXME: Real return value untested */ + return NULL;
if (!buf) { if (size <= dir_len) size = dir_len + 1; - if (!(buf = malloc( size ))) return NULL; + if (!(buf = malloc( size ))) + { + *_errno() = ENOMEM; + return NULL; + } } else if (dir_len >= size) { *_errno() = ERANGE; return NULL; /* buf too small */ } - strcpy(buf,dir); + strcpy(buf, dir); return buf; }
@@ -858,7 +862,7 @@ int CDECL _getdrive(void) * _getdcwd (MSVCRT.@) * * Get the current working directory on a given disk. - * + * * PARAMS * drive [I] Drive letter to get the current working directory from. * buf [O] Destination for the current working directory.
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/dir.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index 97db409bb60..3db90b4c564 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -821,19 +821,23 @@ wchar_t* CDECL _wgetcwd(wchar_t * buf, int size) int dir_len = GetCurrentDirectoryW(MAX_PATH,dir);
if (dir_len < 1) - return NULL; /* FIXME: Real return value untested */ + return NULL;
if (!buf) { if (size <= dir_len) size = dir_len + 1; - if (!(buf = malloc( size * sizeof(WCHAR) ))) return NULL; + if (!(buf = malloc( size * sizeof(WCHAR) ))) + { + *_errno() = ENOMEM; + return NULL; + } } if (dir_len >= size) { *_errno() = ERANGE; return NULL; /* buf too small */ } - wcscpy(buf,dir); + wcscpy(buf, dir); return buf; }
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 19 +++++++++++-------- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 54f988ee9cd..2f14f591273 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1003,7 +1003,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index d84a88ea50b..29918fd3b06 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1349,7 +1349,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 5c65b082309..286c1a7e616 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1355,7 +1355,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 4f3425acc35..4d113a504a5 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -675,7 +675,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 4e26468b489..32e05f38946 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -653,7 +653,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index bdcfea3b01a..6363086b129 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -115,11 +115,6 @@ static wchar_t msvcrt_mbc_to_wc_l(unsigned int ch, _locale_t locale) return chW; }
-static wchar_t msvcrt_mbc_to_wc(unsigned int ch) -{ - return msvcrt_mbc_to_wc_l(ch, NULL); -} - static inline size_t u_strlen( const unsigned char *str ) { return strlen( (const char*) str ); @@ -1640,11 +1635,11 @@ int CDECL _ismbcupper(unsigned int ch) }
/********************************************************************* - * _ismbcsymbol(MSVCRT.@) + * _ismbcsymbol_l(MSVCRT.@) */ -int CDECL _ismbcsymbol(unsigned int ch) +int CDECL _ismbcsymbol_l(unsigned int ch, _locale_t locale) { - wchar_t wch = msvcrt_mbc_to_wc( ch ); + wchar_t wch = msvcrt_mbc_to_wc_l( ch, locale ); WORD ctype; if (!GetStringTypeW(CT_CTYPE3, &wch, 1, &ctype)) { @@ -1654,6 +1649,14 @@ int CDECL _ismbcsymbol(unsigned int ch) return ((ctype & C3_SYMBOL) != 0); }
+/********************************************************************* + * _ismbcsymbol(MSVCRT.@) + */ +int CDECL _ismbcsymbol(unsigned int ch) +{ + return _ismbcsymbol_l(ch, NULL); +} + /********************************************************************* * _ismbcalnum_l (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 156216ae715..e18308848a3 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -624,7 +624,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -# stub _ismbcsymbol_l(long ptr) +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 805ccc908f7..1026aa48de7 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -495,7 +495,7 @@ @ cdecl _ismbcspace(long) @ cdecl _ismbcspace_l(long ptr) @ cdecl _ismbcsymbol(long) -@ stub _ismbcsymbol_l +@ cdecl _ismbcsymbol_l(long ptr) @ cdecl _ismbcupper(long) @ cdecl _ismbcupper_l(long ptr) @ cdecl _ismbslead(ptr ptr) @@ -1094,7 +1094,7 @@ @ cdecl _o__ismbcspace(long) _ismbcspace @ cdecl _o__ismbcspace_l(long ptr) _ismbcspace_l @ cdecl _o__ismbcsymbol(long) _ismbcsymbol -@ stub _o__ismbcsymbol_l +@ cdecl _o__ismbcsymbol_l(long ptr) _ismbcsymbol_l @ cdecl _o__ismbcupper(long) _ismbcupper @ cdecl _o__ismbcupper_l(long ptr) _ismbcupper_l @ cdecl _o__ismbslead(ptr ptr) _ismbslead
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcr100/msvcr100.spec | 2 +- dlls/msvcr110/msvcr110.spec | 2 +- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr80/msvcr80.spec | 2 +- dlls/msvcr90/msvcr90.spec | 2 +- dlls/msvcrt/mbcs.c | 12 +++++++++++- dlls/msvcrt/msvcrt.spec | 2 +- dlls/ucrtbase/ucrtbase.spec | 4 ++-- 8 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 2f14f591273..e56913feaeb 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1116,7 +1116,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index 29918fd3b06..f64c6cf30b5 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1473,7 +1473,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 286c1a7e616..8e6a169a187 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1484,7 +1484,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 4d113a504a5..4bef365a7c8 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -788,7 +788,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 32e05f38946..19f9335f545 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -766,7 +766,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 6363086b129..34e2b06c996 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -654,12 +654,22 @@ size_t CDECL _mbclen(const unsigned char* str) return _mbclen_l(str, NULL); }
+/********************************************************************* + * _mbsinc_l(MSVCRT.@) + */ +unsigned char* CDECL _mbsinc_l(const unsigned char* str, _locale_t locale) +{ + if (!MSVCRT_CHECK_PMT(str)) + return NULL; + return (unsigned char *)(str + _mbclen_l(str, locale)); +} + /********************************************************************* * _mbsinc(MSVCRT.@) */ unsigned char* CDECL _mbsinc(const unsigned char* str) { - return (unsigned char *)(str + _mbclen(str)); + return _mbsinc_l(str, NULL); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index e18308848a3..5ed054df51f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -737,7 +737,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -# stub _mbsinc_l(str ptr) +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 1026aa48de7..e40a4ccaea5 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -631,7 +631,7 @@ @ cdecl _mbsicoll(str str) @ cdecl _mbsicoll_l(str str ptr) @ cdecl _mbsinc(str) -@ stub _mbsinc_l +@ cdecl _mbsinc_l(str ptr) @ cdecl _mbslen(str) @ cdecl _mbslen_l(str ptr) @ cdecl _mbslwr(str) @@ -1200,7 +1200,7 @@ @ cdecl _o__mbsicoll(str str) _mbsicoll @ cdecl _o__mbsicoll_l(str str ptr) _mbsicoll_l @ cdecl _o__mbsinc(str) _mbsinc -@ stub _o__mbsinc_l +@ cdecl _o__mbsinc_l(str ptr) _mbsinc_l @ cdecl _o__mbslen(str) _mbslen @ cdecl _o__mbslen_l(str ptr) _mbslen_l @ cdecl _o__mbslwr(str) _mbslwr
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/string.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index ba2f4fa4357..b787061d789 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -1350,9 +1350,9 @@ int CDECL strcpy_s( char* dst, size_t elem, const char* src ) int CDECL strcat_s( char* dst, size_t elem, const char* src ) { size_t i, j; - if(!dst) return EINVAL; - if(elem == 0) return EINVAL; - if(!src) + if (!MSVCRT_CHECK_PMT(dst != 0)) return EINVAL; + if (!MSVCRT_CHECK_PMT(elem != 0)) return EINVAL; + if (!MSVCRT_CHECK_PMT(src != NULL)) { dst[0] = '\0'; return EINVAL; @@ -1369,6 +1369,7 @@ int CDECL strcat_s( char* dst, size_t elem, const char* src ) } } /* Set the first element to 0, not the first element after the skipped part */ + MSVCRT_INVALID_PMT("dst[elem] is too small", ERANGE); dst[0] = '\0'; return ERANGE; }
From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/msvcrt/string.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index b787061d789..d58a21406b1 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -1328,9 +1328,9 @@ char* CDECL strcpy(char *dst, const char *src) int CDECL strcpy_s( char* dst, size_t elem, const char* src ) { size_t i; - if(!elem) return EINVAL; - if(!dst) return EINVAL; - if(!src) + if (!MSVCRT_CHECK_PMT(dst != 0)) return EINVAL; + if (!MSVCRT_CHECK_PMT(elem != 0)) return EINVAL; + if (!MSVCRT_CHECK_PMT(src != NULL)) { dst[0] = '\0'; return EINVAL; @@ -1340,6 +1340,7 @@ int CDECL strcpy_s( char* dst, size_t elem, const char* src ) { if((dst[i] = src[i]) == '\0') return 0; } + MSVCRT_INVALID_PMT("dst[elem] is too small", ERANGE); dst[0] = '\0'; return ERANGE; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125398
Your paranoid android.
=== debian11 (32 bit report) ===
wmvcore: wmvcore.c:2997: Test failed: Wait timed out.
Piotr Caban (@piotr) commented about dlls/msvcrt/dir.c:
int dir_len = GetCurrentDirectoryA(MAX_PATH,dir);
if (dir_len < 1)
- return NULL; /* FIXME: Real return value untested */
return NULL;
if (!buf) { if (size <= dir_len) size = dir_len + 1;
if (!(buf = malloc( size ))) return NULL;
if (!(buf = malloc( size )))
{
*_errno() = ENOMEM;
return NULL;
}
malloc is already setting errno on failure, there's no need to do it here.
Piotr Caban (@piotr) commented about dlls/msvcrt/mbcs.c:
return _mbclen_l(str, NULL);
}
+/*********************************************************************
_mbsinc_l(MSVCRT.@)
- */
+unsigned char* CDECL _mbsinc_l(const unsigned char* str, _locale_t locale) +{
- if (!MSVCRT_CHECK_PMT(str))
- return NULL;
I didn't test all C-runtime versions but it looks like the function should crash on str == NULL.