diff options
author | Dean Rasheed <dean.a.rasheed@gmail.com> | 2023-11-09 09:56:31 +0000 |
---|---|---|
committer | Dean Rasheed <dean.a.rasheed@gmail.com> | 2023-11-09 09:56:31 +0000 |
commit | 4f4a0010a3a1e0404198130ac3cababeaa17d1e6 (patch) | |
tree | e6613f6d4ed673fa553d1e701d8a771a3362a606 /src/include | |
parent | 319310aa121285b1c7c036cb956a11bcc9d1bcb2 (diff) | |
download | postgresql-4f4a0010a3a1e0404198130ac3cababeaa17d1e6.tar.gz postgresql-4f4a0010a3a1e0404198130ac3cababeaa17d1e6.zip |
Fix corner-case 64-bit integer subtraction bug on some platforms.
When computing "0 - INT64_MIN", most platforms would report an
overflow error, which is correct. However, platforms without integer
overflow builtins or 128-bit integers would fail to spot the overflow,
and incorrectly return INT64_MIN.
Back-patch to all supported branches.
Patch be me. Thanks to Jian He for initial investigation, and Laurenz
Albe and Tom Lane for review.
Discussion: https://postgr.es/m/CAEZATCUNK-AZSD0jVdgkk0N%3DNcAXBWeAEX-QU9AnJPensikmdQ%40mail.gmail.com
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/common/int.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/include/common/int.h b/src/include/common/int.h index a2972218e72..4c862651f5d 100644 --- a/src/include/common/int.h +++ b/src/include/common/int.h @@ -200,8 +200,12 @@ pg_sub_s64_overflow(int64 a, int64 b, int64 *result) *result = (int64) res; return false; #else + /* + * Note: overflow is also possible when a == 0 and b < 0 (specifically, + * when b == PG_INT64_MIN). + */ if ((a < 0 && b > 0 && a < PG_INT64_MIN + b) || - (a > 0 && b < 0 && a > PG_INT64_MAX + b)) + (a >= 0 && b < 0 && a > PG_INT64_MAX + b)) { *result = 0x5EED; /* to avoid spurious warnings */ return true; |