summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorunknown <Kristofer.Pettersson@naruto.>2006-09-19 17:40:09 +0200
committerunknown <Kristofer.Pettersson@naruto.>2006-09-19 17:40:09 +0200
commit18edc55b83a2b9fb4ac6e36c88f86825c207b55f (patch)
treebd18651be61661b07a4846ec2c0dba96be7b19c2 /myisam
parent2247a2ab81708fba82ae3839b48d5fc788f96f02 (diff)
downloadmariadb-git-18edc55b83a2b9fb4ac6e36c88f86825c207b55f.tar.gz
Bug#20789 Merge Subtable Rename Causes Crash
- When a MyISAM table which belongs to a merge table union and is renamed the associated file descriptors are closed on windows. This causes a server crash next time an insert or update is performed on the merge table. - This patch prevents the system from crashing on windows by checking for bad file descriptors every time the MyISAM table is locked by associated the merge table. myisam/mi_locking.c: - Added check for bad file descriptors when table is part of merge union. - This patch prevents the server from crash on windows. myisam/myisamdef.h: Added boolean value to indicate that this myisam table is part of a merge union. myisammrg/myrg_locking.c: Added paramter owned_by_merge=TRUE for mi_lock_database through MYRG_TABLE struct.
Diffstat (limited to 'myisam')
-rw-r--r--myisam/mi_locking.c15
-rw-r--r--myisam/myisamdef.h3
2 files changed, 18 insertions, 0 deletions
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c
index 8d48c5242e5..36b793363c5 100644
--- a/myisam/mi_locking.c
+++ b/myisam/mi_locking.c
@@ -224,6 +224,21 @@ int mi_lock_database(MI_INFO *info, int lock_type)
break; /* Impossible */
}
}
+#ifdef __WIN__
+ else
+ {
+ /*
+ Check for bad file descriptors if this table is part
+ of a merge union. Failing to capture this may cause
+ a crash on windows if the table is renamed and
+ later on referenced by the merge table.
+ */
+ if( info->owned_by_merge && (info->s)->kfile < 0 )
+ {
+ error = HA_ERR_NO_SUCH_TABLE;
+ }
+ }
+#endif
pthread_mutex_unlock(&share->intern_lock);
#if defined(FULL_LOG) || defined(_lint)
lock_type|=(int) (flag << 8); /* Set bit to set if real lock */
diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h
index d589173f0e7..ea45915a088 100644
--- a/myisam/myisamdef.h
+++ b/myisam/myisamdef.h
@@ -278,6 +278,9 @@ struct st_myisam_info {
my_bool page_changed; /* If info->buff can't be used for rnext */
my_bool buff_used; /* If info->buff has to be reread for rnext */
my_bool once_flags; /* For MYISAMMRG */
+#ifdef __WIN__
+ my_bool owned_by_merge; /* This MyISAM table is part of a merge union */
+#endif
#ifdef THREAD
THR_LOCK_DATA lock;
#endif