Correct GetDateFormat handling of uninitialised fields
Bill Medland
billmedland at mercuryspeed.com
Tue Jan 14 22:04:38 CST 2003
Bill Medland (medbi01 at accpac.com)
Correct GetDateFormat handling of uninitialised fields:
Only the year, month and day fields matter; the rest may be uninitialised.
Index: wine/ole/ole2nls.c
===================================================================
RCS file: /home/wine/wine/ole/ole2nls.c,v
retrieving revision 1.111
diff -u -r1.111 ole2nls.c
--- wine/ole/ole2nls.c 19 Dec 2002 21:11:54 -0000 1.111
+++ wine/ole/ole2nls.c 15 Jan 2003 04:00:19 -0000
@@ -1789,14 +1789,26 @@
/* because this conversion will fix invalid time values */
/* check to see if the time/date is valid */
/* set ERROR_INVALID_PARAMETER and return 0 if invalid */
- if((xtime->wDay > 31) || (xtime->wDayOfWeek > 6) || (xtime->wMonth > 12))
+ if((xtime->wDay > 31) || (xtime->wMonth > 12))
{
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
+ /* For all we know the day of week and the time may be absolute
+ * rubbish. Therefore if we are going to use conversion through
+ * FileTime we had better use a clean time (and hopefully we won't
+ * fall over any timezone complications).
+ * If we go with an alternative method of correcting the day of week
+ * (e.g. Zeller's congruence) then we won't need to, but we will need
+ * to check the date.
+ */
+ memset (&t, 0, sizeof(t));
+ t.wYear = xtime->wYear;
+ t.wMonth = xtime->wMonth;
+ t.wDay = xtime->wDay;
/* Silently correct wDayOfWeek by transforming to FileTime and back again */
- res=SystemTimeToFileTime(xtime,&ft);
+ res=SystemTimeToFileTime(&t,&ft);
/* Check year(?)/month and date for range and set ERROR_INVALID_PARAMETER on error */
if(!res)
Index: wine/dlls/kernel/tests/locale.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/tests/locale.c,v
retrieving revision 1.11
diff -u -r1.11 locale.c
--- wine/dlls/kernel/tests/locale.c 2 Jan 2003 17:47:22 -0000 1.11
+++ wine/dlls/kernel/tests/locale.c 15 Jan 2003 04:00:19 -0000
@@ -540,14 +540,16 @@
ok (ret != 0 && error == 0, "GetDateFormatW did not permit null buffer pointer when counting.");
/* 1c An incorrect day of week is corrected. */
+ /* 1d The incorrect day of week can even be out of range. */
+ /* 1e The time doesn't matter */
curtime.wYear = 2002;
curtime.wMonth = 10;
curtime.wDay = 23;
- curtime.wDayOfWeek = 5; /* should be 3 - Wednesday */
- curtime.wHour = 0;
- curtime.wMinute = 0;
- curtime.wSecond = 0;
- curtime.wMilliseconds = 234;
+ curtime.wDayOfWeek = 45612; /* should be 3 - Wednesday */
+ curtime.wHour = 65432;
+ curtime.wMinute = 34512;
+ curtime.wSecond = 65535;
+ curtime.wMilliseconds = 12345;
MultiByteToWideChar (CP_ACP, 0, "dddd d MMMM yyyy", -1, format, COUNTOF(format));
ret = GetDateFormatW (lcid, 0, &curtime, format, buffer, COUNTOF(buffer));
error = ret ? 0 : GetLastError();
--
Bill Medland
ACCPAC International, Inc.
medbi01 at accpac.com
Corporate: www.accpac.com
Hosted Services: www.accpaconline.com
More information about the wine-patches
mailing list