diff options
author | Sergey Glukhov <gluh@mysql.com> | 2008-08-15 11:53:54 +0500 |
---|---|---|
committer | Sergey Glukhov <gluh@mysql.com> | 2008-08-15 11:53:54 +0500 |
commit | 02aaff1b343ffd3cd397cc67d7f9eb69d8cb1545 (patch) | |
tree | 493de30713a4ba8185da9b027000cb08537bd10a /storage | |
parent | a233d7b85174faafeb0a8fa9086fb7a17a30f84d (diff) | |
download | mariadb-git-02aaff1b343ffd3cd397cc67d7f9eb69d8cb1545.tar.gz |
Bug#36638 mysqld crashes when open file limit is passed and general query log enabled
The problem:
CSV storage engine open function returns success even
thought it failed to open the data file
The fix:
return error
Additional fixes:
added MY_WME to my_open to avoid mysterious error message
free share struct if open the file was unsuccessful
mysql-test/r/csv.result:
test result
mysql-test/t/csv.test:
test case
storage/csv/ha_tina.cc:
The problem:
CSV storage engine open function returns success even
thought it failed to open the data file
The fix:
return error
Additional fixes:
added MY_WME to my_open to avoid mysterious error message
free share struct if open the file was unsuccessful
Diffstat (limited to 'storage')
-rw-r--r-- | storage/csv/ha_tina.cc | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index f8dd778045f..a1ff0e29ad1 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -190,17 +190,12 @@ static TINA_SHARE *get_share(const char *table_name, TABLE *table) Usually this will result in auto-repair, and we will get a good meta-file in the end. */ - if ((share->meta_file= my_open(meta_file_name, - O_RDWR|O_CREAT, MYF(0))) == -1) - share->crashed= TRUE; - - /* - If the meta file will not open we assume it is crashed and - mark it as such. - */ - if (read_meta_file(share->meta_file, &share->rows_recorded)) + if (((share->meta_file= my_open(meta_file_name, + O_RDWR|O_CREAT, MYF(MY_WME))) == -1) || + read_meta_file(share->meta_file, &share->rows_recorded)) share->crashed= TRUE; } + share->use_count++; pthread_mutex_unlock(&tina_mutex); @@ -342,11 +337,11 @@ int ha_tina::init_tina_writer() (void)write_meta_file(share->meta_file, share->rows_recorded, TRUE); if ((share->tina_write_filedes= - my_open(share->data_file_name, O_RDWR|O_APPEND, MYF(0))) == -1) + my_open(share->data_file_name, O_RDWR|O_APPEND, MYF(MY_WME))) == -1) { DBUG_PRINT("info", ("Could not open tina file writes")); share->crashed= TRUE; - DBUG_RETURN(1); + DBUG_RETURN(my_errno ? my_errno : -1); } share->tina_write_opened= TRUE; @@ -828,8 +823,12 @@ int ha_tina::open(const char *name, int mode, uint open_options) } local_data_file_version= share->data_file_version; - if ((data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1) - DBUG_RETURN(0); + if ((data_file= my_open(share->data_file_name, + O_RDONLY, MYF(MY_WME))) == -1) + { + free_share(share); + DBUG_RETURN(my_errno ? my_errno : -1); + } /* Init locking. Pass handler object to the locking routines, @@ -1021,8 +1020,8 @@ int ha_tina::init_data_file() { local_data_file_version= share->data_file_version; if (my_close(data_file, MYF(0)) || - (data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1) - return 1; + (data_file= my_open(share->data_file_name, O_RDONLY, MYF(MY_WME))) == -1) + return my_errno ? my_errno : -1; } file_buff->init_buff(data_file); return 0; @@ -1290,8 +1289,9 @@ int ha_tina::rnd_end() DBUG_RETURN(-1); /* Open the file again */ - if (((data_file= my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1)) - DBUG_RETURN(-1); + if (((data_file= my_open(share->data_file_name, + O_RDONLY, MYF(MY_WME))) == -1)) + DBUG_RETURN(my_errno ? my_errno : -1); /* As we reopened the data file, increase share->data_file_version in order to force other threads waiting on a table lock and @@ -1445,8 +1445,8 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt) /* Open the file again, it should now be repaired */ if ((data_file= my_open(share->data_file_name, O_RDWR|O_APPEND, - MYF(0))) == -1) - DBUG_RETURN(-1); + MYF(MY_WME))) == -1) + DBUG_RETURN(my_errno ? my_errno : -1); /* Set new file size. The file size will be updated by ::update_status() */ local_saved_data_file_length= (size_t) current_position; |