diff options
author | unknown <Kristofer.Pettersson@naruto.> | 2006-09-19 17:40:09 +0200 |
---|---|---|
committer | unknown <Kristofer.Pettersson@naruto.> | 2006-09-19 17:40:09 +0200 |
commit | 18edc55b83a2b9fb4ac6e36c88f86825c207b55f (patch) | |
tree | bd18651be61661b07a4846ec2c0dba96be7b19c2 /myisam | |
parent | 2247a2ab81708fba82ae3839b48d5fc788f96f02 (diff) | |
download | mariadb-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.c | 15 | ||||
-rw-r--r-- | myisam/myisamdef.h | 3 |
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 |