Bug #7371 ยป 0001-bigdecimal.c-avoid-undefined-overflow-checking.patch
| ext/bigdecimal/bigdecimal.c | ||
|---|---|---|
|
SIGNED_VALUE e = a->exponent;
|
||
|
SIGNED_VALUE m = e+n;
|
||
|
SIGNED_VALUE eb, mb;
|
||
|
/* Use unsigned VALUE to avoid undefined behavior */
|
||
|
if(e>0) {
|
||
|
if(n>0) {
|
||
|
mb = m*(SIGNED_VALUE)BASE_FIG;
|
||
|
eb = e*(SIGNED_VALUE)BASE_FIG;
|
||
|
mb = m*(VALUE)BASE_FIG;
|
||
|
eb = e*(VALUE)BASE_FIG;
|
||
|
if(mb<eb) goto overflow;
|
||
|
}
|
||
|
} else if(n<0) {
|
||
|
mb = m*(SIGNED_VALUE)BASE_FIG;
|
||
|
eb = e*(SIGNED_VALUE)BASE_FIG;
|
||
|
mb = m*(VALUE)BASE_FIG;
|
||
|
eb = e*(VALUE)BASE_FIG;
|
||
|
if(mb>eb) goto underflow;
|
||
|
}
|
||
|
a->exponent = m;
|
||