Module: wine Branch: master Commit: d0277873ea4776c7b008437a17f0b530dd13bccd URL: https://source.winehq.org/git/wine.git/?a=commit;h=d0277873ea4776c7b008437a1...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Nov 13 22:07:57 2019 +0100
msvcrt: Call invalid parameter handler in strftime.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/time.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index faff48221e..142a96aca1 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -1116,7 +1116,8 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f if(MSVCRT__isleadbyte_l((unsigned char)*format, loc)) { str[ret++] = *(format++); if(ret == max) continue; - if(!str[ret]) goto einval_error; + if(!MSVCRT_CHECK_PMT(str[ret])) + goto einval_error; } str[ret++] = *format; continue; @@ -1130,7 +1131,7 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f alternate = FALSE; }
- if(!mstm) + if(!MSVCRT_CHECK_PMT(mstm)) goto einval_error;
switch(*format) { @@ -1151,13 +1152,13 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f return 0; break; case 'a': - if(mstm->tm_wday<0 || mstm->tm_wday>6) + if(!MSVCRT_CHECK_PMT(mstm->tm_wday>=0 && mstm->tm_wday<=6)) goto einval_error; if(!strftime_str(str, &ret, max, time_data->str.names.short_wday[mstm->tm_wday])) return 0; break; case 'A': - if(mstm->tm_wday<0 || mstm->tm_wday>6) + if(!MSVCRT_CHECK_PMT(mstm->tm_wday>=0 && mstm->tm_wday<=6)) goto einval_error; if(!strftime_str(str, &ret, max, time_data->str.names.wday[mstm->tm_wday])) return 0; @@ -1166,13 +1167,13 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f #if _MSVCR_VER>=140 case 'h': #endif - if(mstm->tm_mon<0 || mstm->tm_mon>11) + if(!MSVCRT_CHECK_PMT(mstm->tm_mon>=0 && mstm->tm_mon<=11)) goto einval_error; if(!strftime_str(str, &ret, max, time_data->str.names.short_mon[mstm->tm_mon])) return 0; break; case 'B': - if(mstm->tm_mon<0 || mstm->tm_mon>11) + if(!MSVCRT_CHECK_PMT(mstm->tm_mon>=0 && mstm->tm_mon<=11)) goto einval_error; if(!strftime_str(str, &ret, max, time_data->str.names.mon[mstm->tm_mon])) return 0; @@ -1268,7 +1269,7 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f break; #endif case 'p': - if(mstm->tm_hour<0 || mstm->tm_hour>23) + if(!MSVCRT_CHECK_PMT(mstm->tm_hour>=0 && mstm->tm_hour<=23)) goto einval_error; if(!strftime_str(str, &ret, max, mstm->tm_hour<12 ? time_data->str.names.am : time_data->str.names.pm)) @@ -1338,7 +1339,9 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f break; case 'U': case 'W': - if(mstm->tm_wday<0 || mstm->tm_wday>6 || mstm->tm_yday<0 || mstm->tm_yday>365) + if(!MSVCRT_CHECK_PMT(mstm->tm_wday>=0 && mstm->tm_wday<=6)) + goto einval_error; + if(!MSVCRT_CHECK_PMT(mstm->tm_yday>=0 && mstm->tm_yday<=365)) goto einval_error; if(*format == 'U') tmp = mstm->tm_wday; @@ -1356,6 +1359,7 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f break; default: WARN("unknown format %c\n", *format); + MSVCRT_INVALID_PMT("unknown format", MSVCRT_EINVAL); goto einval_error; } } @@ -1372,7 +1376,6 @@ static MSVCRT_size_t strftime_helper(char *str, MSVCRT_size_t max, const char *f
einval_error: *str = 0; - *MSVCRT__errno() = MSVCRT_EINVAL; return 0; }