When "add" or "sub" conveters are used, an overflow detection is performed.
When 2 negative integers are added (or a positive integer is substracted to
a positive one), we take care to not exceed the low limit (LLONG_MIN) and
when 2 positive integers are added, we take care to not exceed the high
limit (LLONG_MAX).
However, because of a missing 'else' statement, if there is no overflow in
the first case, we fall back on the second check (the one for positive adds)
and LLONG_MAX is returned. It means that most of time, when 2 negative
integers are added (or a positive integer is substracted to a negative one),
LLONG_MAX is returned.
This patch should solve the issue #2216. It must be backported to all stable
versions.
* +------+----------+----------+
*/
if ((a ^ b) >= 0) {
- /* signs are different. */
+ /* signs are same. */
if (a < 0) {
if (LLONG_MIN - a > b)
return LLONG_MIN;
}
- if (LLONG_MAX - a < b)
+ else if (LLONG_MAX - a < b)
return LLONG_MAX;
}
return a + b;