-- v2: msvcrt: fix error handling for strcpy_s msvcrt: fix error handling for strcat_s msvcrt: Add _mbsinc_l implementation. msvcrt: Add _ismbcsymbol_l implementation.
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 91aaaf5ff18..2c2c25b0e9d 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_s(buf, size, dir); return buf; }
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 2c2c25b0e9d..6065e371b46 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_s(buf, size, 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; }