Module: wine Branch: master Commit: 3f93230812f5db519d5aa11af039ff2b3b289a34 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3f93230812f5db519d5aa11af0...
Author: Owen Rudge orudge@codeweavers.com Date: Thu Mar 8 11:34:19 2012 +0000
comctl32/datetime: Ensure up/down/home/end increments remain within bounds.
---
dlls/comctl32/datetime.c | 33 +++++++++++++++++++++++++++++++-- 1 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c index 1443c35..3ad9204 100644 --- a/dlls/comctl32/datetime.c +++ b/dlls/comctl32/datetime.c @@ -506,6 +506,9 @@ static void DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta) { SYSTEMTIME *date = &infoPtr->date; + SYSTEMTIME range[2]; + DWORD limits; + BOOL min;
TRACE ("%d\n", number); if ((number > infoPtr->nrFields) || (number < 0)) return; @@ -516,7 +519,13 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta) case ONEDIGITYEAR: case TWODIGITYEAR: case FULLYEAR: - date->wYear = wrap(date->wYear, delta, 1752, 9999); + if (delta == INT_MIN) + date->wYear = 1752; + else if (delta == INT_MAX) + date->wYear = 9999; + else + date->wYear = max(min(date->wYear + delta, 9999), 1752); + if (date->wDay > MONTHCAL_MonthLength(date->wMonth, date->wYear)) /* This can happen when moving away from a leap year. */ date->wDay = MONTHCAL_MonthLength(date->wMonth, date->wYear); @@ -573,8 +582,28 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta) date->wMinute = 0; date->wHour = 0; } -}
+ /* Ensure time is within bounds */ + limits = SendMessageW (infoPtr->hMonthCal, MCM_GETRANGE, 0, (LPARAM) &range); + min = ((delta < 0) ? TRUE : FALSE); + + if (limits & (min ? GDTR_MIN : GDTR_MAX)) + { + int i = (min ? 0 : 1); + + if (MONTHCAL_CompareSystemTime(date, &range[i]) == (min ? -1 : 1)) + { + date->wYear = range[i].wYear; + date->wMonth = range[i].wMonth; + date->wDayOfWeek = range[i].wDayOfWeek; + date->wDay = range[i].wDay; + date->wHour = range[i].wHour; + date->wMinute = range[i].wMinute; + date->wSecond = range[i].wSecond; + date->wMilliseconds = range[i].wMilliseconds; + } + } +}
static void DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *width)