Piotr Caban : msvcrt: Call invalid parameter handler in strftime.

Alexandre Julliard julliard at winehq.org
Wed Nov 13 16:01:13 CST 2019


Module: wine
Branch: master
Commit: d0277873ea4776c7b008437a17f0b530dd13bccd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d0277873ea4776c7b008437a17f0b530dd13bccd

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Nov 13 22:07:57 2019 +0100

msvcrt: Call invalid parameter handler in strftime.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
 }
 




More information about the wine-cvs mailing list