comctl32: Fix invalid date/time check in MCM_SETRANGE: ignore time and fail on bad date.

Vitaliy Margolen wine-patch at kievinfo.com
Tue Feb 14 09:00:49 CST 2006


ChangeLog:
comctl32: Fix invalid date/time check in MCM_SETRANGE: ignore time and fail on bad date.

 dlls/comctl32/monthcal.c       |   42 ++++++++++++++++------------------------
 dlls/comctl32/tests/monthcal.c |   21 +++++++++++++++++++-
 2 files changed, 37 insertions(+), 26 deletions(-)
-------------- next part --------------
6389ad21736adbd134796080e0f353fa33677d28
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index 340b681..1de342f 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -160,14 +160,10 @@ int MONTHCAL_MonthLength(int month, int 
 /* make sure that time is valid */
 static int MONTHCAL_ValidateTime(SYSTEMTIME time)
 {
-  if(time.wMonth > 12) return FALSE;
+  if(time.wMonth < 1 || time.wMonth > 12 ) return FALSE;
   if(time.wDayOfWeek > 6) return FALSE;
   if(time.wDay > MONTHCAL_MonthLength(time.wMonth, time.wYear))
 	  return FALSE;
-  if(time.wHour > 23) return FALSE;
-  if(time.wMinute > 59) return FALSE;
-  if(time.wSecond > 59) return FALSE;
-  if(time.wMilliseconds > 999) return FALSE;
 
   return TRUE;
 }
@@ -943,29 +939,25 @@ MONTHCAL_GetMaxTodayWidth(MONTHCAL_INFO 
 static LRESULT
 MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
-  SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *)lParam;
-  int prev;
+    SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *)lParam;
+    int prev;
 
-  TRACE("%x %lx\n", wParam, lParam);
+    TRACE("%x %lx\n", wParam, lParam);
+
+    if ((wParam & GDTR_MIN && !MONTHCAL_ValidateTime(lprgSysTimeArray[0])) ||
+        (wParam & GDTR_MAX && !MONTHCAL_ValidateTime(lprgSysTimeArray[1])))
+        return FALSE;
 
-  if(wParam & GDTR_MAX) {
-    if(MONTHCAL_ValidateTime(lprgSysTimeArray[1])){
-      MONTHCAL_CopyTime(&lprgSysTimeArray[1], &infoPtr->maxDate);
-      infoPtr->rangeValid|=GDTR_MAX;
-    } else  {
-      GetSystemTime(&infoPtr->todaysDate);
-      MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->maxDate);
-    }
-  }
-  if(wParam & GDTR_MIN) {
-    if(MONTHCAL_ValidateTime(lprgSysTimeArray[0])) {
-      MONTHCAL_CopyTime(&lprgSysTimeArray[0], &infoPtr->minDate);
-      infoPtr->rangeValid|=GDTR_MIN;
-    } else {
-      GetSystemTime(&infoPtr->todaysDate);
-      MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->minDate);
+    if (wParam & GDTR_MIN)
+    {
+        MONTHCAL_CopyTime(&lprgSysTimeArray[0], &infoPtr->minDate);
+        infoPtr->rangeValid |= GDTR_MIN;
+    }
+    if (wParam & GDTR_MAX)
+    {
+        MONTHCAL_CopyTime(&lprgSysTimeArray[1], &infoPtr->maxDate);
+        infoPtr->rangeValid |= GDTR_MAX;
     }
-  }
 
   prev = infoPtr->monthRange;
   infoPtr->monthRange = infoPtr->maxDate.wMonth - infoPtr->minDate.wMonth;
diff --git a/dlls/comctl32/tests/monthcal.c b/dlls/comctl32/tests/monthcal.c
index 82b41b3..b04f137 100644
--- a/dlls/comctl32/tests/monthcal.c
+++ b/dlls/comctl32/tests/monthcal.c
@@ -31,7 +31,7 @@
 void test_monthcal(void)
 {
     HWND hwnd;
-    SYSTEMTIME st[2];
+    SYSTEMTIME st[2], st1[2];
     INITCOMMONCONTROLSEX ic = {sizeof(INITCOMMONCONTROLSEX), ICC_DATE_CLASSES};
 
     InitCommonControlsEx(&ic);
@@ -39,6 +39,25 @@ void test_monthcal(void)
                          0, 300, 300, 0, 0, NULL, NULL);
     ok(hwnd != NULL, "Failed to create MonthCal\n");
     GetSystemTime(&st[0]);
+    st[1] = st[0];
+
+    /* Invalid date/time */
+    st[0].wYear  = 2000;
+    /* Time should not matter */
+    st[1].wHour = st[1].wMinute = st[1].wSecond = 70;
+    ok(SendMessage(hwnd, MCM_SETRANGE, GDTR_MAX, (LPARAM)st), "Failed to set MAX limit\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MAX, "No limits should be set\n");
+    ok(st1[0].wYear != 2000, "Lover limit changed\n");
+
+    st[1].wMonth = 0;
+    ok(!SendMessage(hwnd, MCM_SETRANGE, GDTR_MIN | GDTR_MAX, (LPARAM)st), "Should have failed to set limits\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MAX, "No limits should be set\n");
+    ok(st1[0].wYear != 2000, "Lover limit changed\n");
+    ok(!SendMessage(hwnd, MCM_SETRANGE, GDTR_MAX, (LPARAM)st), "Should have failed to set MAX limit\n");
+    ok(SendMessage(hwnd, MCM_GETRANGE, 0, (LPARAM)st1) == GDTR_MAX, "No limits should be set\n");
+    ok(st1[0].wYear != 2000, "Lover limit changed\n");
+
+    GetSystemTime(&st[0]);
     st[0].wMonth = 5;
     st[1] = st[0];
 


More information about the wine-patches mailing list