From: Georgi Kodinov Date: February 2 2011 2:31pm Subject: bzr commit into mysql-5.0 branch (Georgi.Kodinov:2895) Bug#52315 Bug#55755 List-Archive: http://lists.mysql.com/commits/130241 X-Bug: 52315,55755 Message-Id: <201102021431.p12EVRCI029153@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3764246904941310600==" --===============3764246904941310600== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/kgeorge/mysql/work/B55755-5.0/ based on revid:alexander.nozdrin@stripped 2895 Georgi Kodinov 2011-02-02 Fixes for Bug #55755 and Bug #52315 part 2 Bug #55755 : Date STD variable signness breaks server on FreeBSD and OpenBSD * Added a check to configure on the size of time_t * Created a macro to check for a valid time_t that can fit into a my_time_t * Used the macro consistently instead of the ad-hoc checks introduced by 52315 * Fixed compliation warnings on platforms where the size of time_t is smaller than the size of a long (e.g. OpenBSD 4.8 64 amd64). Bug #52315: utc_date() crashes when system time > year 2037 * Added a correct check for the timestamp range instead of just variable size check to SET TIMESTAMP. * Added overflow checking before converting to time_t. * Using a correct localized error message in this case instead of the generic error. * Added a test suite. * fixed the checks so that they check for unsigned time_t as well. Used the checks consistently across the source code. modified: configure.in include/config-win.h include/my_time.h mysql-test/r/func_time.result mysql-test/t/func_time.test sql-common/my_time.c sql/mysqld.cc sql/set_var.cc sql/sql_class.h === modified file 'configure.in' --- a/configure.in 2010-12-28 18:57:23 +0000 +++ b/configure.in 2011-02-02 14:31:12 +0000 @@ -1956,6 +1956,15 @@ dnl MYSQL_CHECK_TIME_T +dnl +dnl check size of time_t +dnl + +AC_CHECK_SIZEOF(time_t, 8) +if test "$ac_cv_sizeof_time_t" -eq 0 +then + AC_MSG_ERROR("MySQL needs a time_t type.") +fi # do we need #pragma interface/#pragma implementation ? # yes if it's gcc 2.x, and not icc pretending to be gcc, and not cygwin === modified file 'include/config-win.h' --- a/include/config-win.h 2009-07-31 19:22:02 +0000 +++ b/include/config-win.h 2011-02-02 14:31:12 +0000 @@ -167,6 +167,11 @@ typedef uint rf_SetTimer; #define SIZEOF_LONG 4 #define SIZEOF_LONG_LONG 8 #define SIZEOF_OFF_T 8 +/* + The size of time_t depends on the compiler. + But it's 8 for all the supported VC versions. +*/ +#define SIZEOF_TIME_T 8 #ifdef _WIN64 #define SIZEOF_CHARP 8 #else === modified file 'include/my_time.h' --- a/include/my_time.h 2008-04-03 15:32:00 +0000 +++ b/include/my_time.h 2011-02-02 14:31:12 +0000 @@ -53,6 +53,19 @@ typedef long my_time_t; #define YY_PART_YEAR 70 +/* + check for valid times only if the range of time_t is greater than + the range of my_time_t +*/ +#if SIZEOF_TIME_T > 4 || defined(TIME_T_UNSIGNED) +# define IS_TIME_T_VALID_FOR_TIMESTAMP(x) \ + ((x) <= TIMESTAMP_MAX_VALUE && \ + (x) >= TIMESTAMP_MIN_VALUE) +#else +# define IS_TIME_T_VALID_FOR_TIMESTAMP(x) \ + ((x) >= TIMESTAMP_MIN_VALUE) +#endif + /* Flags to str_to_datetime */ #define TIME_FUZZY_DATE 1 #define TIME_DATETIME_ONLY 2 === modified file 'mysql-test/r/func_time.result' --- a/mysql-test/r/func_time.result 2008-12-23 14:08:04 +0000 +++ b/mysql-test/r/func_time.result 2011-02-02 14:31:12 +0000 @@ -1323,4 +1323,21 @@ SELECT '2008-02-18' + INTERVAL 1 FRAC_SE ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FRAC_SECOND' at line 1 SELECT '2008-02-18' - INTERVAL 1 FRAC_SECOND; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FRAC_SECOND' at line 1 +# +# Bug #52315 part 2 : utc_date() crashes when system time > year 2037 +# +SET TIMESTAMP=-147490000; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=2147483648; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=2147483646; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=2147483647; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=0; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=-1; +SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=1; +SELECT UTC_TIMESTAMP(); End of 5.0 tests === modified file 'mysql-test/t/func_time.test' --- a/mysql-test/t/func_time.test 2008-12-23 14:08:04 +0000 +++ b/mysql-test/t/func_time.test 2011-02-02 14:31:12 +0000 @@ -838,4 +838,23 @@ SELECT '2008-02-18' + INTERVAL 1 FRAC_SE --error ER_PARSE_ERROR SELECT '2008-02-18' - INTERVAL 1 FRAC_SECOND; + +--echo # +--echo # Bug #52315 part 2 : utc_date() crashes when system time > year 2037 +--echo # + +--disable_result_log +--error ER_WRONG_VALUE_FOR_VAR +SET TIMESTAMP=-147490000; SELECT UTC_TIMESTAMP(); +--error ER_WRONG_VALUE_FOR_VAR +SET TIMESTAMP=2147483648; SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=2147483646; SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=2147483647; SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=0; SELECT UTC_TIMESTAMP(); +--error ER_WRONG_VALUE_FOR_VAR +SET TIMESTAMP=-1; SELECT UTC_TIMESTAMP(); +SET TIMESTAMP=1; SELECT UTC_TIMESTAMP(); +--enable_result_log + + --echo End of 5.0 tests === modified file 'sql-common/my_time.c' --- a/sql-common/my_time.c 2009-09-17 15:10:30 +0000 +++ b/sql-common/my_time.c 2011-02-02 14:31:12 +0000 @@ -985,7 +985,7 @@ my_system_gmt_sec(const MYSQL_TIME *t_sr with unsigned time_t tmp+= shift*86400L might result in a number, larger then TIMESTAMP_MAX_VALUE, so another check will work. */ - if ((tmp < TIMESTAMP_MIN_VALUE) || (tmp > TIMESTAMP_MAX_VALUE)) + if (!IS_TIME_T_VALID_FOR_TIMESTAMP(tmp)) tmp= 0; return (my_time_t) tmp; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-12-28 18:57:23 +0000 +++ b/sql/mysqld.cc 2011-02-02 14:31:12 +0000 @@ -2836,13 +2836,6 @@ static int init_common_variables(const c max_system_variables.pseudo_thread_id= (ulong)~0; server_start_time= flush_status_time= time((time_t*) 0); - /* TODO: remove this when my_time_t is 64 bit compatible */ - if (server_start_time >= (time_t) MY_TIME_T_MAX) - { - sql_print_error("This MySQL server doesn't support dates later then 2038"); - return 1; - } - if (init_thread_environment()) return 1; mysql_init_variables(); @@ -2882,6 +2875,13 @@ static int init_common_variables(const c mysql_slow_log.init_pthread_objects(); mysql_bin_log.init_pthread_objects(); + /* TODO: remove this when my_time_t is 64 bit compatible */ + if (!IS_TIME_T_VALID_FOR_TIMESTAMP(server_start_time)) + { + sql_print_error("This MySQL server doesn't support dates later then 2038"); + return 1; + } + if (gethostname(glob_hostname,sizeof(glob_hostname)) < 0) { strmake(glob_hostname, STRING_WITH_LEN("localhost")); === modified file 'sql/set_var.cc' --- a/sql/set_var.cc 2010-12-28 18:57:23 +0000 +++ b/sql/set_var.cc 2011-02-02 14:31:12 +0000 @@ -2714,14 +2714,14 @@ int set_var_collation_client::update(THD bool sys_var_timestamp::check(THD *thd, set_var *var) { - time_t val; + longlong val; var->save_result.ulonglong_value= var->value->val_int(); - val= (time_t) var->save_result.ulonglong_value; - if (val < (time_t) MY_TIME_T_MIN || val > (time_t) MY_TIME_T_MAX) + val= (longlong) var->save_result.ulonglong_value; + if (val != 0 && // this is how you set the default value + !IS_TIME_T_VALID_FOR_TIMESTAMP(val)) { - my_message(ER_UNKNOWN_ERROR, - "This version of MySQL doesn't support dates later than 2038", - MYF(0)); + char buf[64]; + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "timestamp", llstr(val, buf)); return TRUE; } return FALSE; === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2010-12-28 18:57:23 +0000 +++ b/sql/sql_class.h 2011-02-02 14:31:12 +0000 @@ -1710,7 +1710,7 @@ public: /*TODO: this will be obsolete when we have support for 64 bit my_time_t */ inline bool is_valid_time() { - return (start_time < (time_t) MY_TIME_T_MAX); + return (IS_TIME_T_VALID_FOR_TIMESTAMP(start_time)); } inline void insert_id(ulonglong id_arg) { --===============3764246904941310600== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/georgi.kodinov@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: georgi.kodinov@stripped\ # likdybek1c189a0m # target_branch: file:///Users/kgeorge/mysql/work/B55755-5.0/ # testament_sha1: e80b02c3453705e112059f07de8406e60d4b825e # timestamp: 2011-02-02 16:31:21 +0200 # base_revision_id: alexander.nozdrin@stripped\ # vg9jybrlxo2p2356 # # Begin bundle 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 --===============3764246904941310600==--