diff options
author | Tor Didriksen <tor.didriksen@oracle.com> | 2011-10-14 11:14:44 +0200 |
---|---|---|
committer | Tor Didriksen <tor.didriksen@oracle.com> | 2011-10-14 11:14:44 +0200 |
commit | d6d11c8eb1dc5f6ea413d61238c3e48ec1e043b7 (patch) | |
tree | 83a20dff00f5267ade0c4f58ec5f8357e45faa88 /strings/decimal.c | |
parent | 55fd5189aaa77061e43a923afdb827d20cdfdd59 (diff) | |
parent | 5dc553cd28853b6bce70644a52d835b595fde12a (diff) | |
download | mariadb-git-d6d11c8eb1dc5f6ea413d61238c3e48ec1e043b7.tar.gz |
merge 5.1-security => 5.5-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 954b04ea446..3a170728546 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -1474,9 +1474,8 @@ decimal_round(const 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; @@ -1491,6 +1490,12 @@ decimal_round(const 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; @@ -1504,17 +1509,17 @@ decimal_round(const 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; |