Commit da92505d authored by serg@serg.mylan's avatar serg@serg.mylan

myisam/mi_packrec.c

    more robust checks (catch more corruptions)
parent dfc20590
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
{ bits-=(bit+1); break; } \ { bits-=(bit+1); break; } \
pos+= *pos pos+= *pos
#define OFFSET_TABLE_SIZE 512
static uint read_huff_table(MI_BIT_BUFF *bit_buff,MI_DECODE_TREE *decode_tree, static uint read_huff_table(MI_BIT_BUFF *bit_buff,MI_DECODE_TREE *decode_tree,
uint16 **decode_table,byte **intervall_buff, uint16 **decode_table,byte **intervall_buff,
...@@ -53,7 +54,7 @@ static void fill_quick_table(uint16 *table,uint bits, uint max_bits, ...@@ -53,7 +54,7 @@ static void fill_quick_table(uint16 *table,uint bits, uint max_bits,
uint value); uint value);
static uint copy_decode_table(uint16 *to_pos,uint offset, static uint copy_decode_table(uint16 *to_pos,uint offset,
uint16 *decode_table); uint16 *decode_table);
static uint find_longest_bitstream(uint16 *table); static uint find_longest_bitstream(uint16 *table, uint16 *end);
static void (*get_unpack_function(MI_COLUMNDEF *rec))(MI_COLUMNDEF *field, static void (*get_unpack_function(MI_COLUMNDEF *rec))(MI_COLUMNDEF *field,
MI_BIT_BUFF *buff, MI_BIT_BUFF *buff,
uchar *to, uchar *to,
...@@ -178,7 +179,7 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys) ...@@ -178,7 +179,7 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys)
length=(uint) (elements*2+trees*(1 << myisam_quick_table_bits)); length=(uint) (elements*2+trees*(1 << myisam_quick_table_bits));
if (!(share->decode_tables=(uint16*) if (!(share->decode_tables=(uint16*)
my_malloc((length+512)*sizeof(uint16)+ my_malloc((length+OFFSET_TABLE_SIZE)*sizeof(uint16)+
(uint) (share->pack.header_length+7), (uint) (share->pack.header_length+7),
MYF(MY_WME | MY_ZEROFILL)))) MYF(MY_WME | MY_ZEROFILL))))
{ {
...@@ -186,7 +187,7 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys) ...@@ -186,7 +187,7 @@ my_bool _mi_read_pack_info(MI_INFO *info, pbool fix_keys)
goto err1; goto err1;
} }
tmp_buff=share->decode_tables+length; tmp_buff=share->decode_tables+length;
disk_cache=(byte*) (tmp_buff+512); disk_cache=(byte*) (tmp_buff+OFFSET_TABLE_SIZE);
if (my_read(file,disk_cache, if (my_read(file,disk_cache,
(uint) (share->pack.header_length-sizeof(header)), (uint) (share->pack.header_length-sizeof(header)),
...@@ -302,7 +303,7 @@ static uint read_huff_table(MI_BIT_BUFF *bit_buff, MI_DECODE_TREE *decode_tree, ...@@ -302,7 +303,7 @@ static uint read_huff_table(MI_BIT_BUFF *bit_buff, MI_DECODE_TREE *decode_tree,
decode_tree->intervalls= *intervall_buff; decode_tree->intervalls= *intervall_buff;
if (! intervall_length) if (! intervall_length)
{ {
table_bits=find_longest_bitstream(tmp_buff); table_bits=find_longest_bitstream(tmp_buff, tmp_buff+OFFSET_TABLE_SIZE);
if (table_bits == (uint) ~0) if (table_bits == (uint) ~0)
return 1; return 1;
if (table_bits > myisam_quick_table_bits) if (table_bits > myisam_quick_table_bits)
...@@ -397,19 +398,23 @@ static uint copy_decode_table(uint16 *to_pos, uint offset, ...@@ -397,19 +398,23 @@ static uint copy_decode_table(uint16 *to_pos, uint offset,
} }
static uint find_longest_bitstream(uint16 *table) static uint find_longest_bitstream(uint16 *table, uint16 *end)
{ {
uint length=1,length2; uint length=1,length2;
if (*table > 512)
return ~0;
if (!(*table & IS_CHAR)) if (!(*table & IS_CHAR))
length=find_longest_bitstream(table+ *table)+1; {
uint16 *next= table + *table;
if (next > end || next == table)
return ~0;
length=find_longest_bitstream(next, end)+1;
}
table++; table++;
if (*table > 512)
return ~0;
if (!(*table & IS_CHAR)) if (!(*table & IS_CHAR))
{ {
length2=find_longest_bitstream(table+ *table)+1; uint16 *next= table + *table;
if (next > end || next == table)
return ~0;
length2=find_longest_bitstream(table+ *table, end)+1;
length=max(length,length2); length=max(length,length2);
} }
return length; return length;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment