Commit b5083338 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Improve error handling in wcsrtombs function.

parent dbbe2379
...@@ -407,8 +407,10 @@ static MSVCRT_size_t MSVCRT_wcsrtombs_l(char *mbstr, const MSVCRT_wchar_t **wcst ...@@ -407,8 +407,10 @@ static MSVCRT_size_t MSVCRT_wcsrtombs_l(char *mbstr, const MSVCRT_wchar_t **wcst
if(!mbstr) { if(!mbstr) {
tmp = WideCharToMultiByte(locinfo->lc_codepage, WC_NO_BEST_FIT_CHARS, tmp = WideCharToMultiByte(locinfo->lc_codepage, WC_NO_BEST_FIT_CHARS,
*wcstr, -1, NULL, 0, NULL, &used_default)-1; *wcstr, -1, NULL, 0, NULL, &used_default)-1;
if(used_default) if(!tmp || used_default) {
*MSVCRT__errno() = MSVCRT_EILSEQ;
return -1; return -1;
}
return tmp; return tmp;
} }
...@@ -418,8 +420,10 @@ static MSVCRT_size_t MSVCRT_wcsrtombs_l(char *mbstr, const MSVCRT_wchar_t **wcst ...@@ -418,8 +420,10 @@ static MSVCRT_size_t MSVCRT_wcsrtombs_l(char *mbstr, const MSVCRT_wchar_t **wcst
size = WideCharToMultiByte(locinfo->lc_codepage, WC_NO_BEST_FIT_CHARS, size = WideCharToMultiByte(locinfo->lc_codepage, WC_NO_BEST_FIT_CHARS,
*wcstr, 1, buf, 3, NULL, &used_default); *wcstr, 1, buf, 3, NULL, &used_default);
if(used_default) if(!size || used_default) {
*MSVCRT__errno() = MSVCRT_EILSEQ;
return -1; return -1;
}
if(tmp+size > count) if(tmp+size > count)
return tmp; return tmp;
...@@ -476,6 +480,8 @@ static int MSVCRT_wcsrtombs_s_l(MSVCRT_size_t *ret, char *mbstr, ...@@ -476,6 +480,8 @@ static int MSVCRT_wcsrtombs_s_l(MSVCRT_size_t *ret, char *mbstr,
if(!mbstr && !size && wcstr) { if(!mbstr && !size && wcstr) {
conv = MSVCRT_wcsrtombs_l(NULL, wcstr, 0, locale); conv = MSVCRT_wcsrtombs_l(NULL, wcstr, 0, locale);
if(conv == -1)
return *MSVCRT__errno();
if(ret) if(ret)
*ret = conv+1; *ret = conv+1;
return 0; return 0;
...@@ -492,7 +498,11 @@ static int MSVCRT_wcsrtombs_s_l(MSVCRT_size_t *ret, char *mbstr, ...@@ -492,7 +498,11 @@ static int MSVCRT_wcsrtombs_s_l(MSVCRT_size_t *ret, char *mbstr,
conv = count; conv = count;
conv = MSVCRT_wcsrtombs_l(mbstr, wcstr, conv, locale); conv = MSVCRT_wcsrtombs_l(mbstr, wcstr, conv, locale);
if(conv<size) if(conv == -1) {
if(size)
mbstr[0] = '\0';
return *MSVCRT__errno();
}else if(conv < size)
mbstr[conv++] = '\0'; mbstr[conv++] = '\0';
else if(conv==size && (count==MSVCRT__TRUNCATE || mbstr[conv-1]=='\0')) else if(conv==size && (count==MSVCRT__TRUNCATE || mbstr[conv-1]=='\0'))
mbstr[conv-1] = '\0'; mbstr[conv-1] = '\0';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment