diff options
author | unknown <monty@mashka.mysql.fi> | 2003-03-11 21:25:17 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2003-03-11 21:25:17 +0200 |
commit | d69a5630ff30564d497bf1dc48e5f50b7d226cfc (patch) | |
tree | 00e55d084e071b33aa8a76f402fa608e46ce9ab3 | |
parent | 3f68b65e65433cb31d53229103bc92e9bdc9bc34 (diff) | |
download | mariadb-git-d69a5630ff30564d497bf1dc48e5f50b7d226cfc.tar.gz |
Cleaned up disk_pos_assert() to be more general.
-rw-r--r-- | myisam/mi_open.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/myisam/mi_open.c b/myisam/mi_open.c index 04d035c3ae4..1832d525157 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -35,6 +35,14 @@ static void setup_key_functions(MI_KEYDEF *keyinfo); pos+=size;} +#define disk_pos_assert(pos, end_pos) \ +if (pos > end_pos) \ +{ \ + my_errno=HA_ERR_CRASHED; \ + goto err; \ +} + + /****************************************************************************** ** Return the shared struct if the table is already open. ** In MySQL the server will handle version issues. @@ -270,28 +278,19 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) share->state.header.max_block_size)); strmov(share->filename,name_buff); -#define disk_pos_assert do \ - { \ - if (disk_pos > end_pos) \ - { \ - my_errno=HA_ERR_CRASHED; \ - goto err; \ - } \ - } while(0) - share->blocksize=min(IO_SIZE,myisam_block_size); { MI_KEYSEG *pos=share->keyparts; for (i=0 ; i < keys ; i++) { disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]); - disk_pos_assert; + disk_pos_assert(disk_pos + share->keyinfo[i].keysegs * MI_KEYSEG_SIZE, + end_pos); set_if_smaller(share->blocksize,share->keyinfo[i].block_length); share->keyinfo[i].seg=pos; for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); - disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -318,12 +317,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=0 ; i < uniques ; i++) { disk_pos=mi_uniquedef_read(disk_pos, &share->uniqueinfo[i]); - disk_pos_assert; + disk_pos_assert(disk_pos + share->uniqueinfo[i].keysegs * + MI_KEYSEG_SIZE, end_pos); share->uniqueinfo[i].seg=pos; for (j=0 ; j < share->uniqueinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); - disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -345,10 +344,10 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=0 ; i < keys ; i++) setup_key_functions(share->keyinfo+i); + disk_pos_assert(disk_pos + share->base.fields *MI_COLUMNDEF_SIZE, end_pos); for (i=j=offset=0 ; i < share->base.fields ; i++) { disk_pos=mi_recinfo_read(disk_pos,&share->rec[i]); - disk_pos_assert; share->rec[i].pack_type=0; share->rec[i].huff_tree=0; share->rec[i].offset=offset; |