diff options
author | Satya B <satya.bn@sun.com> | 2009-04-07 18:42:51 +0530 |
---|---|---|
committer | Satya B <satya.bn@sun.com> | 2009-04-07 18:42:51 +0530 |
commit | 87bedb59ab38b9fd67e74980fc366e47d90ed727 (patch) | |
tree | 604e968f72d064e604ff2a554d8216fe737d14e8 /myisam | |
parent | b9bdc35d537a6db1a6f27b6921aa8e77d8c93700 (diff) | |
parent | c045d1dcea0b2582b38ee5476b090097182c7144 (diff) | |
download | mariadb-git-87bedb59ab38b9fd67e74980fc366e47d90ed727.tar.gz |
merge to latest 5.0-bugteam
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/mi_packrec.c | 36 |
1 files changed, 9 insertions, 27 deletions
diff --git a/myisam/mi_packrec.c b/myisam/mi_packrec.c index df9a4d18a6c..68911d7f129 100644 --- a/myisam/mi_packrec.c +++ b/myisam/mi_packrec.c @@ -208,10 +208,17 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys) This segment will be reallocated after construction of the tables. */ length=(uint) (elements*2+trees*(1 << myisam_quick_table_bits)); + /* + To keep some algorithms simpler, we accept that they access + bytes beyond the end of the input data. This can affect up to + one byte less than the "word size" size used in this file, + which is BITS_SAVED / 8. To avoid accessing non-allocated + data, we add (BITS_SAVED / 8) - 1 bytes to the buffer size. + */ if (!(share->decode_tables=(uint16*) my_malloc((length + OFFSET_TABLE_SIZE) * sizeof(uint16) + - (uint) (share->pack.header_length - sizeof(header)), - MYF(MY_WME | MY_ZEROFILL)))) + (uint) (share->pack.header_length - sizeof(header) + + (BITS_SAVED / 8) - 1), MYF(MY_WME | MY_ZEROFILL)))) goto err1; tmp_buff=share->decode_tables+length; disk_cache=(byte*) (tmp_buff+OFFSET_TABLE_SIZE); @@ -1430,31 +1437,6 @@ static void fill_buffer(MI_BIT_BUFF *bit_buff) bit_buff->current_byte=0; return; } - else - { - uint len= 0; - uint i= 0; - /* - Check if the remaining buffer/record to read is less than the word size. - If so read byte by byte - - Note: if this branch becomes a bottleneck it can be removed, assuming - that the second memory segment allocates 7 extra bytes (see - _mi_read_pack_info()). - */ - len= bit_buff->end - bit_buff->pos; - if (len < (BITS_SAVED / 8)) - { - bit_buff->current_byte= 0; - for (i=0 ; i < len ; i++) - { - bit_buff->current_byte+= (((uint) ((uchar) bit_buff->pos[len - i - 1])) - << (8 * i)); - } - bit_buff->pos= bit_buff->end; - return; - } - } #if BITS_SAVED == 64 bit_buff->current_byte= ((((uint) ((uchar) bit_buff->pos[7]))) + |