summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorunknown <ingo@mysql.com>2005-04-16 21:01:46 +0200
committerunknown <ingo@mysql.com>2005-04-16 21:01:46 +0200
commit1eb806615556df47a604378b6a4505f327353298 (patch)
treec26aca99997c74cd3c3baaab403412de8bb5b4e1 /myisam
parentcef7e66e988793950c685ab998293353078c4b8e (diff)
parentec280d6ffb908535cc5bf5dd279fc926a37301d9 (diff)
downloadmariadb-git-1eb806615556df47a604378b6a4505f327353298.tar.gz
Merge mysql.com:/home/mydev/mysql-4.1-bug9188
into mysql.com:/home/mydev/mysql-5.0-bug9188 myisam/myisampack.c: Auto merged
Diffstat (limited to 'myisam')
-rw-r--r--myisam/myisampack.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/myisam/myisampack.c b/myisam/myisampack.c
index bda620a594a..352c7954d72 100644
--- a/myisam/myisampack.c
+++ b/myisam/myisampack.c
@@ -1712,7 +1712,7 @@ static int compress_isam_file(PACK_MRG_INFO *mrg, HUFF_COUNTS *huff_counts)
ulong tot_blob_length=0;
if (! error)
{
- if (flush_buffer(max_calc_length+max_pack_length))
+ if (flush_buffer((ulong) max_calc_length + (ulong) max_pack_length))
break;
record_pos=file_buffer.pos;
file_buffer.pos+=max_pack_length;
@@ -1935,7 +1935,20 @@ static void init_file_buffer(File file, pbool read_buffer)
static int flush_buffer(ulong neaded_length)
{
ulong length;
- if ((ulong) (file_buffer.end - file_buffer.pos) > neaded_length)
+
+ /*
+ file_buffer.end is 8 bytes lower than the real end of the buffer.
+ This is done so that the end-of-buffer condition does not need to be
+ checked for every byte (see write_bits()). Consequently,
+ file_buffer.pos can become greater than file_buffer.end. The
+ algorithms in the other functions ensure that there will never be
+ more than 8 bytes written to the buffer without an end-of-buffer
+ check. So the buffer cannot be overrun. But we need to check for the
+ near-to-buffer-end condition to avoid a negative result, which is
+ casted to unsigned and thus becomes giant.
+ */
+ if ((file_buffer.pos < file_buffer.end) &&
+ ((ulong) (file_buffer.end - file_buffer.pos) > neaded_length))
return 0;
length=(ulong) (file_buffer.pos-file_buffer.buffer);
file_buffer.pos=file_buffer.buffer;
@@ -2007,7 +2020,7 @@ static void write_bits (register ulong value, register uint bits)
}
#endif
if (file_buffer.pos >= file_buffer.end)
- VOID(flush_buffer((uint) ~0));
+ VOID(flush_buffer(~ (ulong) 0));
file_buffer.bits=(int) (BITS_SAVED - bits);
file_buffer.current_byte=(uint) (value << (BITS_SAVED - bits));
}