comctl32: Fix invalid date/time check in MCM_SETRANGE: ignore time and fail on bad date.
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 @@
/* 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 @@
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_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 && !MONTHCAL_ValidateTime(lprgSysTimeArray[0])) ||
+ (wParam & GDTR_MAX && !MONTHCAL_ValidateTime(lprgSysTimeArray[1])))
+ return FALSE;
+
+ if (wParam & GDTR_MIN)
+ {
+ MONTHCAL_CopyTime(&lprgSysTimeArray[0], &infoPtr->minDate);
+ infoPtr->rangeValid |= GDTR_MIN;
}
- }
- 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_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 @@
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];