summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@sun.com>2010-02-12 16:33:03 +0400
committerSergey Vojtovich <svoj@sun.com>2010-02-12 16:33:03 +0400
commit91f0212c68662f57d922e61ce3f5a5defd697949 (patch)
treef04955698b971556bf691b5f4e2a763f8fd288d1
parent6124451d9534b1a03e58724411c492d9de980cb4 (diff)
downloadmariadb-git-91f0212c68662f57d922e61ce3f5a5defd697949.tar.gz
BUG#48757 - missing .ARZ file causes server crash
Server crashes when accessing ARCHIVE table with missing .ARZ file. When opening a table, ARCHIVE didn't properly pass through error code from lower level azopen() to higher level open() method. mysql-test/r/archive.result: A test case for BUG#48757. mysql-test/t/archive.test: A test case for BUG#48757. storage/archive/ha_archive.cc: Pass through error code from azopen().
-rw-r--r--mysql-test/r/archive.result9
-rw-r--r--mysql-test/t/archive.test11
-rw-r--r--storage/archive/ha_archive.cc21
3 files changed, 33 insertions, 8 deletions
diff --git a/mysql-test/r/archive.result b/mysql-test/r/archive.result
index c620eb97cab..f14f6a39386 100644
--- a/mysql-test/r/archive.result
+++ b/mysql-test/r/archive.result
@@ -12728,3 +12728,12 @@ Table Op Msg_type Msg_text
test.t1 repair Error Table upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it!
test.t1 repair error Corrupt
DROP TABLE t1;
+#
+# BUG#48757 - missing .ARZ file causes server crash
+#
+CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
+FLUSH TABLE t1;
+SELECT * FROM t1;
+ERROR HY000: Can't find file: 't1' (errno: 2)
+DROP TABLE t1;
+ERROR 42S02: Unknown table 't1'
diff --git a/mysql-test/t/archive.test b/mysql-test/t/archive.test
index 90f5b1b0b53..67ad0517ed2 100644
--- a/mysql-test/t/archive.test
+++ b/mysql-test/t/archive.test
@@ -1644,3 +1644,14 @@ INSERT INTO t1 (col1, col2) VALUES (1, "value");
REPAIR TABLE t1;
DROP TABLE t1;
remove_file $MYSQLD_DATADIR/test/t1.ARM;
+
+--echo #
+--echo # BUG#48757 - missing .ARZ file causes server crash
+--echo #
+CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
+FLUSH TABLE t1;
+--remove_file $MYSQLD_DATADIR/test/t1.ARZ
+--error ER_FILE_NOT_FOUND
+SELECT * FROM t1;
+--error ER_BAD_TABLE_ERROR
+DROP TABLE t1;
diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc
index 42ff9daa77e..364ffba0f6c 100644
--- a/storage/archive/ha_archive.cc
+++ b/storage/archive/ha_archive.cc
@@ -355,6 +355,9 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name, int *rc)
*/
if (!(azopen(&archive_tmp, share->data_file_name, O_RDONLY|O_BINARY)))
{
+ *rc= my_errno ? my_errno : -1;
+ pthread_mutex_unlock(&archive_mutex);
+ my_free(share, MYF(0));
DBUG_RETURN(NULL);
}
stats.auto_increment_value= archive_tmp.auto_increment + 1;
@@ -504,16 +507,18 @@ int ha_archive::open(const char *name, int mode, uint open_options)
For now we have to refuse to open such table to avoid
potential data loss.
*/
- if ((rc == HA_ERR_CRASHED_ON_USAGE && !(open_options & HA_OPEN_FOR_REPAIR))
- || rc == HA_ERR_TABLE_NEEDS_UPGRADE)
+ switch (rc)
{
- /* purecov: begin inspected */
+ case 0:
+ break;
+ case HA_ERR_CRASHED_ON_USAGE:
+ if (open_options & HA_OPEN_FOR_REPAIR)
+ break;
+ /* fall through */
+ case HA_ERR_TABLE_NEEDS_UPGRADE:
free_share();
- DBUG_RETURN(rc);
- /* purecov: end */
- }
- else if (rc == HA_ERR_OUT_OF_MEM)
- {
+ /* fall through */
+ default:
DBUG_RETURN(rc);
}