summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorGeorgi Kodinov <Georgi.Kodinov@Oracle.com>2010-06-04 16:21:19 +0300
committerGeorgi Kodinov <Georgi.Kodinov@Oracle.com>2010-06-04 16:21:19 +0300
commit121e04732ea3b5edf36335f827cc5bcb08fb7665 (patch)
tree84dac453baa2a878b6dcb1c5ece486502e0d2180 /sql
parentbd9fa7da26a2d37d8fafd26d453ed62e4d97f85f (diff)
downloadmariadb-git-121e04732ea3b5edf36335f827cc5bcb08fb7665.tar.gz
Bug #52315: utc_date() crashes when system time > year 2037
Some of the server implementations don't support dates later than 2038 due to the internal time type being 32 bit. Added checks so that the server will refuse dates that cannot be handled by either throwing an error when setting date at runtime or by refusing to start or shutting down the server if the system date cannot be stored in my_time_t.
Diffstat (limited to 'sql')
-rw-r--r--sql/mysqld.cc8
-rw-r--r--sql/set_var.cc18
-rw-r--r--sql/set_var.h1
-rw-r--r--sql/sql_class.h5
-rw-r--r--sql/sql_parse.cc13
5 files changed, 44 insertions, 1 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 4b0739cc2d2..bda4e796ce2 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2835,6 +2835,14 @@ static int init_common_variables(const char *conf_file_name, int argc,
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();
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 8e032d44a62..16a22f129e6 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -2712,10 +2712,26 @@ int set_var_collation_client::update(THD *thd)
/****************************************************************************/
+bool sys_var_timestamp::check(THD *thd, set_var *var)
+{
+ time_t 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)
+ {
+ my_message(ER_UNKNOWN_ERROR,
+ "This version of MySQL doesn't support dates later than 2038",
+ MYF(0));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
bool sys_var_timestamp::update(THD *thd, set_var *var)
{
thd->set_time((time_t) var->save_result.ulonglong_value);
- return 0;
+ return FALSE;
}
diff --git a/sql/set_var.h b/sql/set_var.h
index 5fb883e8b86..9945c69cac0 100644
--- a/sql/set_var.h
+++ b/sql/set_var.h
@@ -536,6 +536,7 @@ class sys_var_timestamp :public sys_var
{
public:
sys_var_timestamp(const char *name_arg) :sys_var(name_arg) {}
+ bool check(THD *thd, set_var *var);
bool update(THD *thd, set_var *var);
void set_default(THD *thd, enum_var_type type);
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
diff --git a/sql/sql_class.h b/sql/sql_class.h
index ac058bca4f9..c195c8be864 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -1707,6 +1707,11 @@ public:
inline void end_time() { safe_time(&start_time); }
inline void set_time(time_t t) { time_after_lock=start_time=user_time=t; }
inline void lock_time() { safe_time(&time_after_lock); }
+ /*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);
+ }
inline void insert_id(ulonglong id_arg)
{
last_insert_id= id_arg;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 381aa0cf054..d9e1ea9e4e7 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1771,6 +1771,19 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->enable_slow_log= TRUE;
thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
thd->set_time();
+ if (!thd->is_valid_time())
+ {
+ /*
+ If the time has got past 2038 we need to shut this server down
+ We do this by making sure every command is a shutdown and we
+ have enough privileges to shut the server down
+
+ TODO: remove this when we have full 64 bit my_time_t support
+ */
+ thd->security_ctx->master_access|= SHUTDOWN_ACL;
+ command= COM_SHUTDOWN;
+ }
+
VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query_id= global_query_id;