BUG/MINOR: sample: Fix wrong overflow detection in add/sub conveters
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.
(cherry picked from commit b982fc21770d433a2edfac1336974d289316b271)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit ca6bf9116496eb33aea314e593b576daa49d7331)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 09dbf401bf0f21f2e3819e13cdf456ed6ac94337)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 13db908de5732d143454c0df041060a8435df506)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/sample.c b/src/sample.c
index 33628ae..a294f80 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -2964,12 +2964,12 @@
* +------+----------+----------+
*/
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;