diff options
author | Tor Didriksen <tor.didriksen@oracle.com> | 2011-10-14 10:44:27 +0200 |
---|---|---|
committer | Tor Didriksen <tor.didriksen@oracle.com> | 2011-10-14 10:44:27 +0200 |
commit | 5dc553cd28853b6bce70644a52d835b595fde12a (patch) | |
tree | 405e896fc90733d1183cf4cb7f2fcc22e53a7307 /strings/decimal.c | |
parent | a2cbf8358bf698e5577cad32d870c46f7590cd92 (diff) | |
parent | a6145f4b62bd264ad32d2dade98eda0cc6de0dba (diff) | |
download | mariadb-git-5dc553cd28853b6bce70644a52d835b595fde12a.tar.gz |
merge 5.0-security => 5.1 security
Diffstat (limited to 'strings/decimal.c')
-rw-r--r-- | strings/decimal.c | 21 |
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; |