diff options
author | unknown <istruewing@chilla.local> | 2007-05-31 20:04:54 +0200 |
---|---|---|
committer | unknown <istruewing@chilla.local> | 2007-05-31 20:04:54 +0200 |
commit | 823ed13800b4b9f7f8c2a30261ebf7389297a8cc (patch) | |
tree | fa7a327a0b4ab782ce7e0cdffe5bd4bd41b7f163 /mysys/mf_keycache.c | |
parent | 9f3380d106e1513a50530ac91d3bb7f8d71f3ca7 (diff) | |
download | mariadb-git-823ed13800b4b9f7f8c2a30261ebf7389297a8cc.tar.gz |
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Setting a key_cache_block_size which is not a power of 2
could corrupt MyISAM tables.
A couple of computations in the key cache code use bit
operations which do only work if key_cache_block_size
is a power of 2.
Replaced bit operations by arithmetic operations
to make key cache able to handle block sizes that are
not a power of 2.
include/keycache.h:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Removed element 'key_cache_shift' from KEY_CACHE after
the changes in mf_keycache.c made it unused.
mysql-test/r/key_cache.result:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Added test result
mysql-test/t/key_cache.test:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Added test
mysys/mf_keycache.c:
Bug#28478 - Improper key_cache_block_size corrupts MyISAM tables
Replaced bit operations by arithmetic operations
to make key cache able to handle block sizes that are
not a power of 2.
Diffstat (limited to 'mysys/mf_keycache.c')
-rw-r--r-- | mysys/mf_keycache.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c index 87f136dbf81..af910678a1f 100644 --- a/mysys/mf_keycache.c +++ b/mysys/mf_keycache.c @@ -173,7 +173,7 @@ static void test_key_cache(KEY_CACHE *keycache, #endif #define KEYCACHE_HASH(f, pos) \ -(((ulong) ((pos) >> keycache->key_cache_shift)+ \ +(((ulong) ((pos) / keycache->key_cache_block_size) + \ (ulong) (f)) & (keycache->hash_entries-1)) #define FILE_HASH(f) ((uint) (f) & (CHANGED_BLOCKS_HASH-1)) @@ -329,7 +329,6 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, keycache->key_cache_mem_size= use_mem; keycache->key_cache_block_size= key_cache_block_size; - keycache->key_cache_shift= my_bit_log2(key_cache_block_size); DBUG_PRINT("info", ("key_cache_block_size: %u", key_cache_block_size)); @@ -352,7 +351,7 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, ALIGN_SIZE(hash_links * sizeof(HASH_LINK)) + ALIGN_SIZE(sizeof(HASH_LINK*) * keycache->hash_entries))) + - ((ulong) blocks << keycache->key_cache_shift) > use_mem) + ((ulong) blocks * keycache->key_cache_block_size) > use_mem) blocks--; /* Allocate memory for cache page buffers */ if ((keycache->block_mem= @@ -1807,7 +1806,7 @@ byte *key_cache_read(KEY_CACHE *keycache, uint status; int page_st; - offset= (uint) (filepos & (keycache->key_cache_block_size-1)); + offset= (uint) (filepos % keycache->key_cache_block_size); /* Read data in key_cache_block_size increments */ do { @@ -1946,7 +1945,7 @@ int key_cache_insert(KEY_CACHE *keycache, int error; uint offset; - offset= (uint) (filepos & (keycache->key_cache_block_size-1)); + offset= (uint) (filepos % keycache->key_cache_block_size); do { keycache_pthread_mutex_lock(&keycache->cache_lock); @@ -2081,7 +2080,7 @@ int key_cache_write(KEY_CACHE *keycache, int page_st; uint offset; - offset= (uint) (filepos & (keycache->key_cache_block_size-1)); + offset= (uint) (filepos % keycache->key_cache_block_size); do { keycache_pthread_mutex_lock(&keycache->cache_lock); |