]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/time.cpp
fixing overrelease and out-of-bounds write, fixes #13725
[wxWidgets.git] / src / common / time.cpp
index 03df19ec62b0488688fdc7e334c20126e7db612d..5b2460ca6910797294e6b695428b9a80c510e656 100644 (file)
@@ -26,7 +26,7 @@
 #include "wx/time.h"
 
 #ifndef WX_PRECOMP
-    #ifdef __WXMSW__
+    #ifdef __WINDOWS__
         #include "wx/msw/wrapwin.h"
     #endif
     #include "wx/intl.h"
@@ -36,7 +36,7 @@
 #ifndef WX_GMTOFF_IN_TM
     // Define it for some systems which don't (always) use configure but are
     // known to have tm_gmtoff field.
-    #if defined(__WXPALMOS__) || defined(__DARWIN__)
+    #if defined(__DARWIN__)
         #define WX_GMTOFF_IN_TM
     #endif
 #endif
 #  endif
 #endif
 
-#if defined(__MWERKS__) && defined(__WXMSW__)
-#   undef HAVE_FTIME
-#   undef HAVE_GETTIMEOFDAY
-#endif
-
-#ifndef __WXPALMOS5__
 #ifndef __WXWINCE__
 #include <time.h>
 #else
 #include "wx/msw/private.h"
 #include "wx/msw/wince/time.h"
 #endif
-#endif // __WXPALMOS5__
 
 
 #if !defined(__WXMAC__) && !defined(__WXWINCE__)
     #include <sys/timeb.h>
 #endif
 
-#ifdef __WXPALMOS__
-    #include <DateTime.h>
-    #include <TimeMgr.h>
-    #include <SystemMgr.h>
-#endif
-
-#if defined(__MWERKS__) && wxUSE_UNICODE
-    #include <wtime.h>
-#endif
-
 #if defined(__DJGPP__) || defined(__WINE__)
     #include <sys/timeb.h>
     #include <values.h>
@@ -223,15 +206,18 @@ int wxGetTimeZone()
     #else // VC++ < 8
         return timezone;
     #endif
-#elif defined(WX_TIMEZONE) // If WX_TIMEZONE was defined by configure, use it.
-    return WX_TIMEZONE;
-#elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
-    return _timezone;
-#elif defined(__MWERKS__)
-    return 28800;
-#else // unknown platform -- assume it has timezone
-    return timezone;
-#endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM
+#else // Use some kind of time zone variable.
+    // In any case we must initialize the time zone before using it.
+    tzset();
+
+    #if defined(WX_TIMEZONE) // If WX_TIMEZONE was defined by configure, use it.
+        return WX_TIMEZONE;
+    #elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
+        return _timezone;
+    #else // unknown platform -- assume it has timezone
+        return timezone;
+    #endif // different time zone variables
+#endif // different ways to determine time zone
 }
 
 // Get local time as seconds since 00:00:00, Jan 1st 1970
@@ -275,7 +261,7 @@ long wxGetUTCTime()
 
 wxLongLong wxGetUTCTimeUSec()
 {
-#if defined(__WXMSW__)
+#if defined(__WINDOWS__)
     FILETIME ft;
     ::GetSystemTimeAsFileTime(&ft);
 
@@ -306,23 +292,9 @@ wxLongLong wxGetUTCTimeUSec()
 // Get local time as milliseconds since 00:00:00, Jan 1st 1970
 wxLongLong wxGetUTCTimeMillis()
 {
-    wxLongLong val = MILLISECONDS_PER_SECOND;
-
     // If possible, use a function which avoids conversions from
     // broken-up time structures to milliseconds
-#if defined(__WXPALMOS__)
-    DateTimeType thenst;
-    thenst.second  = 0;
-    thenst.minute  = 0;
-    thenst.hour    = 0;
-    thenst.day     = 1;
-    thenst.month   = 1;
-    thenst.year    = 1970;
-    thenst.weekDay = 5;
-    uint32_t now = TimGetSeconds();
-    uint32_t then = TimDateTimeToSeconds (&thenst);
-    return SysTimeToMilliSecs(SysTimeInSecs(now - then));
-#elif defined(__WXMSW__)
+#if defined(__WINDOWS__)
     FILETIME ft;
     ::GetSystemTimeAsFileTime(&ft);
 
@@ -332,7 +304,10 @@ wxLongLong wxGetUTCTimeMillis()
     t /= 10000;
     t -= wxLL(11644473600000); // Unix - Windows epochs difference in ms.
     return t;
-#elif defined(HAVE_GETTIMEOFDAY)
+#else // !__WINDOWS__
+    wxLongLong val = MILLISECONDS_PER_SECOND;
+
+#if defined(HAVE_GETTIMEOFDAY)
     struct timeval tp;
     if ( wxGetTimeOfDay(&tp) != -1 )
     {
@@ -368,6 +343,8 @@ wxLongLong wxGetUTCTimeMillis()
     val *= wxGetUTCTime();
     return val;
 #endif // time functions
+
+#endif // __WINDOWS__/!__WINDOWS__
 }
 
 wxLongLong wxGetLocalTimeMillis()