With this commit the following functions were implemented: - _mbsupr_s_l - converts multibyte string to uppercase, by using specified locale that's passed in. - _mbslwr_s_l - converts multibyte string to lowercase, by using specified locale that's passed in. - _mbctolower_l - converts multibyte uppercase character to lowercase character, by using specified locale that's passed in. - _mbctoupper_l - converts multibyte lowercase character to uppercase character, by using specified locale that's passed in.
More information about these methods are available at: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strupr-s-s...
After applying the patch the crash of the ChessBase application was fixed. More information: https://bugs.winehq.org/show_bug.cgi?id=45273
From: Bartosz Kosiorek gang65@poczta.onet.pl
With this commit the following functions were implemented: - _mbsupr_s_l - converts multibyte string to uppercase, by using specified locale that's passed in. - _mbslwr_s_l - converts multibyte string to lowercase, by using specified locale that's passed in. - _mbctolower_l - converts multibyte uppercase character to lowercase character, by using specified locale that's passed in. - _mbctoupper_l - converts multibyte lowercase character to uppercase character, by using specified locale that's passed in.
More information about these methods are available at: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strupr-s-s...
After applying patch the crash of the ChessBase application was fixed. More information: https://bugs.winehq.org/show_bug.cgi?id=45273 --- dlls/msvcr100/msvcr100.spec | 8 +-- dlls/msvcr110/msvcr110.spec | 8 +-- dlls/msvcr120/msvcr120.spec | 8 +-- dlls/msvcr80/msvcr80.spec | 8 +-- dlls/msvcr90/msvcr90.spec | 8 +-- dlls/msvcrt/mbcs.c | 89 +++++++++++++++++------- dlls/msvcrt/msvcrt.spec | 8 +-- dlls/msvcrt/tests/string.c | 131 ++++++++++++++++++++++++++++++++++-- dlls/ucrtbase/ucrtbase.spec | 16 ++--- 9 files changed, 221 insertions(+), 63 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index c0bbbc5b86d..b051cf6a77f 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1088,11 +1088,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) @@ -1122,7 +1122,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -1202,7 +1202,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index a272ae98a1c..593df178536 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -1445,11 +1445,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) @@ -1479,7 +1479,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -1559,7 +1559,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index d16316e7e05..cd92da9a8d7 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -1456,11 +1456,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) @@ -1490,7 +1490,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -1570,7 +1570,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 371d17ecc21..de0da8e26e9 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -760,11 +760,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) @@ -794,7 +794,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -874,7 +874,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index dc9d4ae097b..d5f94a65f78 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -738,11 +738,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype @ stub _mblen_l @ cdecl _mbsbtype(str long) @@ -772,7 +772,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -852,7 +852,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index dc9abca1b44..01aa4718f8d 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -25,6 +25,7 @@
#include <stdio.h> #include <limits.h> +#include <locale.h> #include <mbctype.h> #include <mbstring.h>
@@ -447,29 +448,47 @@ unsigned int CDECL _mbsnextc(const unsigned char* str) }
/********************************************************************* - * _mbctolower(MSVCRT.@) + * _mbctolower_l(MSVCRT.@) + * converts multibyte uppercase character to lowercase character, by using specified locale that's passed in. */ -unsigned int CDECL _mbctolower(unsigned int c) +unsigned int CDECL _mbctolower_l(unsigned int c, _locale_t locale) { - if (_ismbblead(c)) + if (_ismbblead_l(c, locale)) { FIXME("Handle MBC chars\n"); return c; } - return _tolower_l(c, NULL); /* ASCII CP or SB char */ + return _tolower_l(c, locale); /* ASCII CP or SB char */ }
/********************************************************************* - * _mbctoupper(MSVCRT.@) + * _mbctolower(MSVCRT.@) */ -unsigned int CDECL _mbctoupper(unsigned int c) +unsigned int CDECL _mbctolower(unsigned int c) { - if (_ismbblead(c)) + return _mbctolower_l(c, NULL); +} + +/********************************************************************* + * _mbctoupper_l(MSVCRT.@) + * converts multibyte lowercase character to uppercase character, by using specified locale that's passed in. + */ +unsigned int CDECL _mbctoupper_l(unsigned int c, _locale_t locale) +{ + if (_ismbblead_l(c, locale)) { FIXME("Handle MBC chars\n"); return c; } - return _toupper_l(c, NULL); /* ASCII CP or SB char */ + return _toupper_l(c, locale); /* ASCII CP or SB char */ +} + +/********************************************************************* + * _mbctoupper(MSVCRT.@) + */ +unsigned int CDECL _mbctoupper(unsigned int c) +{ + return _mbctoupper_l(c, NULL); }
/********************************************************************* @@ -2049,17 +2068,19 @@ unsigned char* CDECL _mbslwr(unsigned char* s) return ret; }
- /********************************************************************* - * _mbslwr_s(MSVCRT.@) + * _mbslwr_s_l(MSVCRT.@) + * converts multibyte string to lowercase, by using specified locale that's passed in. */ -int CDECL _mbslwr_s(unsigned char* s, size_t len) +int CDECL _mbslwr_s_l(unsigned char* str, size_t len, _locale_t locale) { - if (!s && !len) + //bako obsuga jest w z _strlwr_s_l (plik string.c) + + if (!str && !len) { return 0; } - else if (!s || !len) + else if (!str || !len) { *_errno() = EINVAL; return EINVAL; @@ -2067,28 +2088,37 @@ int CDECL _mbslwr_s(unsigned char* s, size_t len) if (get_mbcinfo()->ismbcodepage) { unsigned int c; - for ( ; *s && len > 0; len--) + for ( ; *str && len > 0; len--) { - c = _mbctolower(_mbsnextc(s)); + c = _mbctolower_l(_mbsnextc_l(str, locale), locale); /* Note that I assume that the size of the character is unchanged */ if (c > 255) { - *s++=(c>>8); + *str++=(c>>8); c=c & 0xff; } - *s++=c; + *str++=c; } } - else for ( ; *s && len > 0; s++, len--) *s = _tolower_l(*s, NULL); - if (*s) + else + for ( ; *str && len > 0; str++, len--) + *str = _tolower_l(*str, locale); + if (*str) { - *s = '\0'; + *str = '\0'; *_errno() = EINVAL; return EINVAL; } return 0; }
+/********************************************************************* + * _mbslwr_s(MSVCRT.@) + */ +int CDECL _mbslwr_s(unsigned char* str, size_t len) +{ + return _mbslwr_s_l(str, len, NULL); +}
/********************************************************************* * _mbsupr(MSVCRT.@) @@ -2119,9 +2149,10 @@ unsigned char* CDECL _mbsupr(unsigned char* s)
/********************************************************************* - * _mbsupr_s(MSVCRT.@) + * _mbsupr_s_l(MSVCRT.@) + * converts multibyte string to uppercase, by using specified locale that's passed in. */ -int CDECL _mbsupr_s(unsigned char* s, size_t len) +int CDECL _mbsupr_s_l(unsigned char* s, size_t len, _locale_t locale) { if (!s && !len) { @@ -2137,7 +2168,7 @@ int CDECL _mbsupr_s(unsigned char* s, size_t len) unsigned int c; for ( ; *s && len > 0; len--) { - c = _mbctoupper(_mbsnextc(s)); + c = _mbctoupper_l(_mbsnextc_l(s, locale), locale); /* Note that I assume that the size of the character is unchanged */ if (c > 255) { @@ -2147,7 +2178,9 @@ int CDECL _mbsupr_s(unsigned char* s, size_t len) *s++=c; } } - else for ( ; *s && len > 0; s++, len--) *s = _toupper_l(*s, NULL); + else + for ( ; *s && len > 0; s++, len--) + *s = _toupper_l(*s, locale); if (*s) { *s = '\0'; @@ -2157,6 +2190,14 @@ int CDECL _mbsupr_s(unsigned char* s, size_t len) return 0; }
+/********************************************************************* + * _mbsupr_s(MSVCRT.@) + */ +int CDECL _mbsupr_s(unsigned char* s, size_t len) +{ + return _mbsupr_s_l(*s, len, NULL); +} + /********************************************************************* * _mbsspn_l (MSVCRT.@) */ diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 3aab3600e1d..308f295dd0d 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -705,11 +705,11 @@ @ cdecl _mbctokata(long) # stub _mbctokata_l(long ptr) @ cdecl _mbctolower(long) -# stub _mbctolower_l(long ptr) +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) # stub _mbctombb_l(long ptr) @ cdecl _mbctoupper(long) -# stub _mbctoupper_l(long ptr) +@ cdecl _mbctoupper_l(long ptr) @ extern _mbctype MSVCRT_mbctype # stub _mblen_l(str long ptr) @ cdecl _mbsbtype(str long) @@ -743,7 +743,7 @@ @ cdecl _mbslwr(str) # stub _mbslwr_l(str ptr) @ cdecl _mbslwr_s(str long) -# stub _mbslwr_s_l(str long ptr) +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) # stub _mbsnbcat_l(str str long ptr) @ cdecl _mbsnbcat_s(str long ptr long) @@ -823,7 +823,7 @@ @ cdecl _mbsupr(str) # stub _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) -# stub _mbsupr_s_l(str long ptr) +# cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c index 4e525193ced..5526de77ba3 100644 --- a/dlls/msvcrt/tests/string.c +++ b/dlls/msvcrt/tests/string.c @@ -92,7 +92,9 @@ static errno_t (__cdecl *p_ultoa_s)(__msvcrt_ulong,char*,size_t,int); static int *p__mb_cur_max; static unsigned char *p_mbctype; static int (__cdecl *p_wcslwr_s)(wchar_t*,size_t); +static errno_t (__cdecl *p_mbsupr_s_l)(unsigned char *str, size_t numberOfElements, _locale_t locale); static errno_t (__cdecl *p_mbsupr_s)(unsigned char *str, size_t numberOfElements); +static errno_t (__cdecl *p_mbslwr_s_l)(unsigned char *str, size_t numberOfElements, _locale_t locale); static errno_t (__cdecl *p_mbslwr_s)(unsigned char *str, size_t numberOfElements); static int (__cdecl *p_wctob)(wint_t); static wint_t (__cdecl *p_btowc)(int); @@ -133,13 +135,13 @@ static void test_swab( void ) { char expected1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ@#"; char expected2[] = "ABCDEFGHIJKLMNOPQRSTUVWX$"; char expected3[] = "$"; - + char from[30]; char to[30]; - + int testsize; - - /* Test 1 - normal even case */ + + /* Test 1 - normal even case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -147,7 +149,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing even size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 2 - uneven case */ + /* Test 2 - uneven case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 25; @@ -155,7 +157,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected2,testsize) == 0, "Testing odd size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 3 - from = to */ + /* Test 3 - from = to */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -163,7 +165,7 @@ static void test_swab( void ) { _swab( to, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing overlapped size %d returned '%*.*s'\n", testsize, testsize, testsize, to);
- /* Test 4 - 1 bytes */ + /* Test 4 - 1 bytes */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 1; @@ -2835,6 +2837,62 @@ static void test__mbsnbcat_s(void) "Expected the output buffer string to be "\0inosaurdu" without ending null terminator\n"); }
+static void test__mbsupr_s_l(void) +{ + errno_t ret; + unsigned char buffer[20]; + + if (!p_mbsupr_s_l) + { + win_skip("Skipping _mbsupr_s_l tests\n"); + return; + } + + errno = EBADF; + ret = p_mbsupr_s_l(NULL, 0, NULL); + ok(ret == 0, "Expected _mbsupr_s_l to return 0, got %d\n", ret); + + errno = EBADF; + ret = p_mbsupr_s_l(NULL, sizeof(buffer), NULL); + ok(ret == EINVAL, "Expected _mbsupr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + errno = EBADF; + ret = p_mbsupr_s_l(buffer, 0, NULL); + ok(ret == EINVAL, "Expected _mbsupr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + memcpy(buffer, "abcdefgh", sizeof("abcdefgh")); + errno = EBADF; + ret = p_mbsupr_s_l(buffer, sizeof("abcdefgh"), NULL); + ok(ret == 0, "Expected _mbsupr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "ABCDEFGH", sizeof("ABCDEFGH")), + "Expected the output buffer to be "ABCDEFGH", got "%s"\n", + buffer); + + memcpy(buffer, "abcdefgh", sizeof("abcdefgh")); + errno = EBADF; + ret = p_mbsupr_s_l(buffer, sizeof(buffer), NULL); + ok(ret == 0, "Expected _mbsupr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "ABCDEFGH", sizeof("ABCDEFGH")), + "Expected the output buffer to be "ABCDEFGH", got "%s"\n", + buffer); + + memcpy(buffer, "abcdefgh", sizeof("abcdefgh")); + errno = EBADF; + ret = p_mbsupr_s_l(buffer, 4, NULL); + ok(ret == EINVAL, "Expected _mbsupr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + memcpy(buffer, "abcdefgh\0ijklmnop", sizeof("abcdefgh\0ijklmnop")); + errno = EBADF; + ret = p_mbsupr_s_l(buffer, sizeof(buffer), "English_United States.1252"); + ok(ret == 0, "Expected _mbsupr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "ABCDEFGH\0ijklmnop", sizeof("ABCDEFGH\0ijklmnop")), + "Expected the output buffer to be "ABCDEFGH\0ijklmnop", got "%s"\n", + buffer); +} + static void test__mbsupr_s(void) { errno_t ret; @@ -2889,7 +2947,62 @@ static void test__mbsupr_s(void) ok(!memcmp(buffer, "ABCDEFGH\0ijklmnop", sizeof("ABCDEFGH\0ijklmnop")), "Expected the output buffer to be "ABCDEFGH\0ijklmnop", got "%s"\n", buffer); +} + +static void test__mbslwr_s_l(void) +{ + errno_t ret; + unsigned char buffer[20]; + + if (!p_mbslwr_s_l) + { + win_skip("Skipping _mbslwr_s_l tests\n"); + return; + } + + errno = EBADF; + ret = p_mbslwr_s_l(NULL, 0, NULL); + ok(ret == 0, "Expected _mbslwr_s_l to return 0, got %d\n", ret); + + errno = EBADF; + ret = p_mbslwr_s_l(NULL, sizeof(buffer), NULL); + ok(ret == EINVAL, "Expected _mbslwr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + errno = EBADF; + ret = p_mbslwr_s_l(buffer, 0, NULL); + ok(ret == EINVAL, "Expected _mbslwr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + memcpy(buffer, "ABCDEFGH", sizeof("ABCDEFGH")); + errno = EBADF; + ret = p_mbslwr_s_l(buffer, sizeof("ABCDEFGH"), NULL); + ok(ret == 0, "Expected _mbslwr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "abcdefgh", sizeof("abcdefgh")), + "Expected the output buffer to be "abcdefgh", got "%s"\n", + buffer); + + memcpy(buffer, "ABCDEFGH", sizeof("ABCDEFGH")); + errno = EBADF; + ret = p_mbslwr_s_l(buffer, sizeof(buffer), NULL); + ok(ret == 0, "Expected _mbslwr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "abcdefgh", sizeof("abcdefgh")), + "Expected the output buffer to be "abcdefgh", got "%s"\n", + buffer); + + memcpy(buffer, "ABCDEFGH", sizeof("ABCDEFGH")); + errno = EBADF; + ret = p_mbslwr_s_l(buffer, 4, NULL); + ok(ret == EINVAL, "Expected _mbslwr_s_l to return EINVAL, got %d\n", ret); + ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
+ memcpy(buffer, "ABCDEFGH\0IJKLMNOP", sizeof("ABCDEFGH\0IJKLMNOP")); + errno = EBADF; + ret = p_mbslwr_s_l(buffer, sizeof(buffer), NULL); + ok(ret == 0, "Expected _mbslwr_s_l to return 0, got %d\n", ret); + ok(!memcmp(buffer, "abcdefgh\0IJKLMNOP", sizeof("abcdefgh\0IJKLMNOP")), + "Expected the output buffer to be "abcdefgh\0IJKLMNOP", got "%s"\n", + buffer); }
static void test__mbslwr_s(void) @@ -4639,7 +4752,9 @@ START_TEST(string) p_strlwr_s = (void *)GetProcAddress(hMsvcrt, "_strlwr_s"); p_ultoa_s = (void *)GetProcAddress(hMsvcrt, "_ultoa_s"); p_wcslwr_s = (void*)GetProcAddress(hMsvcrt, "_wcslwr_s"); + p_mbsupr_s_l = (void*)GetProcAddress(hMsvcrt, "_mbsupr_s_l"); p_mbsupr_s = (void*)GetProcAddress(hMsvcrt, "_mbsupr_s"); + p_mbslwr_s_l = (void*)GetProcAddress(hMsvcrt, "_mbslwr_s_l"); p_mbslwr_s = (void*)GetProcAddress(hMsvcrt, "_mbslwr_s"); p_btowc = (void*)GetProcAddress(hMsvcrt, "btowc"); p_wctob = (void*)GetProcAddress(hMsvcrt, "wctob"); @@ -4720,7 +4835,9 @@ START_TEST(string) test__mbsnbcat_s(); test__ultoa_s(); test__wcslwr_s(); + test__mbsupr_s_l(); test__mbsupr_s(); + test__mbslwr_s_l(); test__mbslwr_s(); test_wctob(); test_btowc(); diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index a4acf724d2f..2a751547e33 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -603,11 +603,11 @@ @ cdecl _mbctokata(long) @ stub _mbctokata_l @ cdecl _mbctolower(long) -@ stub _mbctolower_l +@ cdecl _mbctolower_l(long ptr) @ cdecl _mbctombb(long) @ stub _mbctombb_l @ cdecl _mbctoupper(long) -@ stub _mbctoupper_l +@ cdecl _mbctoupper_l(long ptr) @ stub _mblen_l @ cdecl _mbsbtype(str long) @ stub _mbsbtype_l @@ -637,7 +637,7 @@ @ cdecl _mbslwr(str) @ stub _mbslwr_l @ cdecl _mbslwr_s(str long) -@ stub _mbslwr_s_l +@ cdecl _mbslwr_s_l(str long ptr) @ cdecl _mbsnbcat(str str long) @ stub _mbsnbcat_l @ cdecl _mbsnbcat_s(str long ptr long) @@ -717,7 +717,7 @@ @ cdecl _mbsupr(str) @ stub _mbsupr_l @ cdecl _mbsupr_s(str long) -@ stub _mbsupr_s_l +@ cdecl _mbsupr_s_l(str long ptr) @ cdecl _mbtowc_l(ptr str long ptr) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) @@ -1173,11 +1173,11 @@ @ cdecl _o__mbctokata(long) _mbctokata @ stub _o__mbctokata_l @ cdecl _o__mbctolower(long) _mbctolower -@ stub _o__mbctolower_l +@ cdecl _o__mbctolower_l(long ptr) _mbctolower_l @ cdecl _o__mbctombb(long) _mbctombb @ stub _o__mbctombb_l @ cdecl _o__mbctoupper(long) _mbctoupper -@ stub _o__mbctoupper_l +@ cdecl _o__mbctoupper_l(long ptr) _mbctoupper_l @ stub _o__mblen_l @ cdecl _o__mbsbtype(str long) _mbsbtype @ stub _o__mbsbtype_l @@ -1206,7 +1206,7 @@ @ cdecl _o__mbslwr(str) _mbslwr @ stub _o__mbslwr_l @ cdecl _o__mbslwr_s(str long) _mbslwr_s -@ stub _o__mbslwr_s_l +@ cdecl _o__mbslwr_s_l(str long ptr) _mbslwr_s_l @ cdecl _o__mbsnbcat(str str long) _mbsnbcat @ stub _o__mbsnbcat_l @ cdecl _o__mbsnbcat_s(str long ptr long) _mbsnbcat_s @@ -1286,7 +1286,7 @@ @ cdecl _o__mbsupr(str) _mbsupr @ stub _o__mbsupr_l @ cdecl _o__mbsupr_s(str long) _mbsupr_s -@ stub _o__mbsupr_s_l +@ cdecl _o__mbsupr_s_l(str long ptr) _mbsupr_s_l @ cdecl _o__mbtowc_l(ptr str long ptr) _mbtowc_l @ cdecl _o__memicmp(str str long) _memicmp @ cdecl _o__memicmp_l(str str long ptr) _memicmp_l
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=125058
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
msvcrt: 0384:string: unhandled exception c0000005 at 77CB58D1
=== w7u_adm (32 bit report) ===
msvcrt: 0860:string: unhandled exception c0000005 at 761458D1
=== w7u_el (32 bit report) ===
msvcrt: 0860:string: unhandled exception c0000005 at 76CA58D1
=== w8 (32 bit report) ===
msvcrt: 0ab8:string: unhandled exception c0000005 at 76ED26BE
=== w8adm (32 bit report) ===
msvcrt: 0320:string: unhandled exception c0000005 at 76DC26BE
=== w864 (32 bit report) ===
msvcrt: 0be0:string: unhandled exception c0000005 at 772E26BE
=== w1064v1507 (32 bit report) ===
msvcrt: 0f8c:string: unhandled exception c0000005 at 74BF4E0E
=== w1064v1809 (32 bit report) ===
msvcrt: 1c74:string: unhandled exception c0000005 at 76005BBD
=== w1064 (32 bit report) ===
msvcrt: 1654:string: unhandled exception c0000005 at 768049DB
=== w1064_tsign (32 bit report) ===
msvcrt: 0b2c:string: unhandled exception c0000005 at 763449DB
=== w10pro64 (32 bit report) ===
msvcrt: 1eb8:string: unhandled exception c0000005 at 777C49DB
=== w864 (64 bit report) ===
msvcrt: 0bb4:string: unhandled exception c0000005 at 00007FFDCD7117B5
=== w1064v1507 (64 bit report) ===
msvcrt: 0168:string: unhandled exception c0000005 at 00007FFFDF4B7ACC
=== w1064v1809 (64 bit report) ===
msvcrt: 1d38:string: unhandled exception c0000005 at 00007FFAD15E7C89
=== w1064 (64 bit report) ===
msvcrt: 1d48:string: unhandled exception c0000005 at 00007FFEE39D7C19
=== w1064_2qxl (64 bit report) ===
msvcrt: 1d34:string: unhandled exception c0000005 at 00007FF8F52F7C19
=== w1064_adm (64 bit report) ===
msvcrt: 1a84:string: unhandled exception c0000005 at 00007FFAE7097C19
=== w1064_tsign (64 bit report) ===
msvcrt: 1ed0:string: unhandled exception c0000005 at 00007FFD842B7C19
=== w10pro64 (64 bit report) ===
msvcrt: 1d74:string: unhandled exception c0000005 at 00007FFCF1417C19
=== w10pro64_en_AE_u8 (64 bit report) ===
msvcrt: 1a64:string: unhandled exception c0000005 at 00007FF99DCF7C19
=== w10pro64_ar (64 bit report) ===
msvcrt: 071c:string: unhandled exception c0000005 at 00007FFC518C7C19
=== w10pro64_ja (64 bit report) ===
msvcrt: 0f74:string: unhandled exception c0000005 at 00007FFA413E7C19
=== w10pro64_zh_CN (64 bit report) ===
msvcrt: 2034:string: unhandled exception c0000005 at 00007FFD3B617C19
=== debian11 (32 bit report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit ar:MA report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit de report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit fr report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit he:IL report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit hi:IN report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit ja:JP report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (32 bit zh:CN report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (build log) ===
Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24882. Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24882. Use of uninitialized value $Flaky in addition (+) at /home/testbot/lib/WineTestBot/LogUtils.pm line 720, <$LogFile> line 24882.
=== debian11 (32 bit WoW report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x6a2ba670).
=== debian11 (64 bit WoW report) ===
msvcrt: string.c:2847: Test failed: Skipping _mbsupr_s_l tests Unhandled exception: page fault on read access to 0x0000000000000000 in 64-bit code (0x0000006a0b9ec4).