Commit fc99b521 authored by unknown's avatar unknown

memory overrun in decimal_mod

parent 2c0e731c
...@@ -1305,7 +1305,7 @@ static int do_div_mod(decimal *from1, decimal *from2, ...@@ -1305,7 +1305,7 @@ static int do_div_mod(decimal *from1, decimal *from2,
{ {
int frac1=ROUND_UP(from1->frac)*DIG_PER_DEC1, prec1=from1->intg+frac1, int frac1=ROUND_UP(from1->frac)*DIG_PER_DEC1, prec1=from1->intg+frac1,
frac2=ROUND_UP(from2->frac)*DIG_PER_DEC1, prec2=from2->intg+frac2, frac2=ROUND_UP(from2->frac)*DIG_PER_DEC1, prec2=from2->intg+frac2,
error, i, intg0, frac0, len1, len2, dlen1, dintg; error, i, intg0, frac0, len1, len2, dlen1, dintg, div=(!mod);
dec1 *buf0, *buf1=from1->buf, *buf2=from2->buf, *tmp1, dec1 *buf0, *buf1=from1->buf, *buf2=from2->buf, *tmp1,
*start2, *stop2, *stop1, *stop0, norm2, carry, *start1; *start2, *stop2, *stop1, *stop0, norm2, carry, *start1;
dec2 norm_factor, x, guess, y; dec2 norm_factor, x, guess, y;
...@@ -1387,8 +1387,9 @@ static int do_div_mod(decimal *from1, decimal *from2, ...@@ -1387,8 +1387,9 @@ static int do_div_mod(decimal *from1, decimal *from2,
} }
buf0=to->buf; buf0=to->buf;
stop0=buf0+intg0+frac0; stop0=buf0+intg0+frac0;
while (dintg++ < 0) if (likely(div))
*buf0++=0; while (dintg++ < 0)
*buf0++=0;
len1=(i=ROUND_UP(prec1))+ROUND_UP(2*frac2+scale_incr+1); len1=(i=ROUND_UP(prec1))+ROUND_UP(2*frac2+scale_incr+1);
set_if_bigger(len1, 3); set_if_bigger(len1, 3);
...@@ -1427,7 +1428,8 @@ static int do_div_mod(decimal *from1, decimal *from2, ...@@ -1427,7 +1428,8 @@ static int do_div_mod(decimal *from1, decimal *from2,
if (unlikely(*start1 == 0)) if (unlikely(*start1 == 0))
{ {
start1++; start1++;
*buf0=0; if (likely(div))
*buf0=0;
continue; continue;
} }
...@@ -1493,7 +1495,8 @@ static int do_div_mod(decimal *from1, decimal *from2, ...@@ -1493,7 +1495,8 @@ static int do_div_mod(decimal *from1, decimal *from2,
} }
DBUG_ASSERT(carry==1); DBUG_ASSERT(carry==1);
} }
*buf0=(dec1)guess; if (likely(div))
*buf0=(dec1)guess;
if (*start1 == 0) if (*start1 == 0)
start1++; start1++;
} }
...@@ -1988,6 +1991,12 @@ main() ...@@ -1988,6 +1991,12 @@ main()
test_md("234.567","10.555"); test_md("234.567","10.555");
test_md("-234.567","10.555"); test_md("-234.567","10.555");
test_md("234.567","-10.555"); test_md("234.567","-10.555");
if (full)
{
c.buf[1]=0x3ABECA;
test_md("99999999999999999999999999999999999999","3");
printf("%X\n", c.buf[1]);
}
printf("==== decimal2bin/bin2decimal ====\n"); printf("==== decimal2bin/bin2decimal ====\n");
test_d2b2d("-10.55", 4, 2); test_d2b2d("-10.55", 4, 2);
......
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