List:Commits« Previous MessageNext Message »
From:msvensson Date:February 23 2007 5:33pm
Subject:bk commit into 5.0 tree (msvensson:1.2440) BUG#26536
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of msvensson. When msvensson does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +2 -0
  Bug#26536 func_time failure on vm-win2003-64-b, occurs every time
   - Avoid overflow in sec_since_epoch by shifting the time
     back 2 days for times close to the maximum range of my_time_t
   - Improve comment about why we need my_time_t
   - Patch will also fix timezone2.test

  include/my_time.h@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +7 -1
    Improve comment for my_time_t, especially that we require
    it to be at least a 32bit unsigned type

  sql/tztime.cc@stripped, 2007-02-23 17:33:11+01:00, msvensson@stripped +20 -3
    - Add assert in sec_since_epoch to guard it against broken down time
    values that would cause overflow in my_time_t on systems with 32 bit
    my_time_t
    - Avoid overflow in sec_since_epoch by "shifting" the broken down
    time back 2 days for times that are near the max value.c

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	msvensson
# Host:	pilot.blaudden
# Root:	/home/msvensson/mysql/bug26536/my50-bug26536

--- 1.37/sql/tztime.cc	2006-12-23 20:04:28 +01:00
+++ 1.38/sql/tztime.cc	2007-02-23 17:33:11 +01:00
@@ -780,6 +780,8 @@ gmt_sec_to_TIME(TIME *tmp, my_time_t sec
 static my_time_t
 sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
 {
+  /* Guard against my_time_t overflow(on system with 32 bit my_time_t) */
+  DBUG_ASSERT(!(year == TIMESTAMP_MAX_YEAR && mon == 1 && mday > 17));
 #ifndef WE_WANT_TO_HANDLE_UNORMALIZED_DATES
   /*
     It turns out that only whenever month is normalized or unnormalized
@@ -948,12 +950,12 @@ TIME_to_gmt_sec(const TIME *t, const TIM
   */
   if (shift)
   {
-    if (local_t > (my_time_t) (TIMESTAMP_MAX_VALUE - shift*86400L +
+    if (local_t > (my_time_t) (TIMESTAMP_MAX_VALUE - shift * SECS_PER_DAY +
                                sp->revtis[i].rt_offset - saved_seconds))
     {
       DBUG_RETURN(0);                           /* my_time_t overflow */
     }
-    local_t+= shift*86400L;
+    local_t+= shift * SECS_PER_DAY;
   }
 
   if (sp->revtis[i].rt_type)
@@ -1341,6 +1343,7 @@ my_time_t
 Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
 {
   my_time_t local_t;
+  int shift= 0;
 
   /*
     Check timestamp range.we have to do this as calling function relies on
@@ -1349,9 +1352,23 @@ Time_zone_offset::TIME_to_gmt_sec(const 
   if (!validate_timestamp_range(t))
     return 0;
 
-  local_t= sec_since_epoch(t->year, t->month, t->day,
+  /*
+    Do a temporary shift of the boundary dates to avoid
+    overflow of my_time_t if the time value is near it's
+    maximum range
+  */
+  if ((t->year == TIMESTAMP_MAX_YEAR) && (t->month == 1) &&
t->day > 4)
+    shift= 2;
+
+  local_t= sec_since_epoch(t->year, t->month, (t->day - shift),
                            t->hour, t->minute, t->second) -
            offset;
+
+  if (shift)
+  {
+    /* Add back the shifted time */
+    local_t+= shift * SECS_PER_DAY;
+  }
 
   if (local_t >= TIMESTAMP_MIN_VALUE && local_t <= TIMESTAMP_MAX_VALUE)
     return local_t;

--- 1.18/include/my_time.h	2006-12-30 21:02:04 +01:00
+++ 1.19/include/my_time.h	2007-02-23 17:33:11 +01:00
@@ -30,7 +30,13 @@ extern uchar days_in_month[];
 
 /*
   Portable time_t replacement.
-  Should be signed and hold seconds for 1902-2038 range.
+  Should be signed and hold seconds for 1902 -- 2038-01-19 range
+  i.e at least a 32bit variable
+
+  Using the system built in time_t is not an option as
+  we rely on the above requirements in the time functions
+
+  For example QNX has an unsigned time_t type
 */
 typedef long my_time_t;
 
Thread
bk commit into 5.0 tree (msvensson:1.2440) BUG#26536msvensson23 Feb