summaryrefslogtreecommitdiff
path: root/strings/decimal.c
diff options
context:
space:
mode:
authorTor Didriksen <tor.didriksen@oracle.com>2011-10-14 10:44:27 +0200
committerTor Didriksen <tor.didriksen@oracle.com>2011-10-14 10:44:27 +0200
commit5dc553cd28853b6bce70644a52d835b595fde12a (patch)
tree405e896fc90733d1183cf4cb7f2fcc22e53a7307 /strings/decimal.c
parenta2cbf8358bf698e5577cad32d870c46f7590cd92 (diff)
parenta6145f4b62bd264ad32d2dade98eda0cc6de0dba (diff)
downloadmariadb-git-5dc553cd28853b6bce70644a52d835b595fde12a.tar.gz
merge 5.0-security => 5.1 security
Diffstat (limited to 'strings/decimal.c')
-rw-r--r--strings/decimal.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/strings/decimal.c b/strings/decimal.c
index 6c89657004c..dcf3f4b42e3 100644
--- a/strings/decimal.c
+++ b/strings/decimal.c
@@ -1494,9 +1494,8 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
{
int frac0=scale>0 ? ROUND_UP(scale) : scale/DIG_PER_DEC1,
frac1=ROUND_UP(from->frac), UNINIT_VAR(round_digit),
- intg0=ROUND_UP(from->intg), error=E_DEC_OK, len=to->len,
- intg1=ROUND_UP(from->intg +
- (((intg0 + frac0)>0) && (from->buf[0] == DIG_MAX)));
+ intg0=ROUND_UP(from->intg), error=E_DEC_OK, len=to->len;
+
dec1 *buf0=from->buf, *buf1=to->buf, x, y, carry=0;
int first_dig;
@@ -1511,6 +1510,12 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
default: DBUG_ASSERT(0);
}
+ /*
+ For my_decimal we always use len == DECIMAL_BUFF_LENGTH == 9
+ For internal testing here (ifdef MAIN) we always use len == 100/4
+ */
+ DBUG_ASSERT(from->len == to->len);
+
if (unlikely(frac0+intg0 > len))
{
frac0=len-intg0;
@@ -1524,17 +1529,17 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
return E_DEC_OK;
}
- if (to != from || intg1>intg0)
+ if (to != from)
{
dec1 *p0= buf0+intg0+max(frac1, frac0);
- dec1 *p1= buf1+intg1+max(frac1, frac0);
+ dec1 *p1= buf1+intg0+max(frac1, frac0);
+
+ DBUG_ASSERT(p0 - buf0 <= len);
+ DBUG_ASSERT(p1 - buf1 <= len);
while (buf0 < p0)
*(--p1) = *(--p0);
- if (unlikely(intg1 > intg0))
- to->buf[0]= 0;
- intg0= intg1;
buf0=to->buf;
buf1=to->buf;
to->sign=from->sign;