Fix signed overflow issue in npy_gcd for INT_MIN on s390x
Resolves: RHEL-193000
This commit is contained in:
parent
0860696e15
commit
2677b5a6f2
70
fix-signed-overflow-s390x.patch
Normal file
70
fix-signed-overflow-s390x.patch
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
From 80071371601233408b4d919dfe7cc05cfee93d02 Mon Sep 17 00:00:00 2001
|
||||||
|
From: AnkitAhlawat <Ankit.Ahlawat@ibm.com>
|
||||||
|
Date: Thu, 30 Apr 2026 19:18:10 +0530
|
||||||
|
Subject: [PATCH] BUG: Fix signed overflow issue in npy_gcd for INT_MIN on
|
||||||
|
s390x (#31360)
|
||||||
|
|
||||||
|
This PR fixes signed overflow issue in npy_gcd when one of the inputs is the minimum value of a signed integer type (INT_MIN) on s390x architecture.
|
||||||
|
|
||||||
|
issue was the expression a < 0 ? -a : a in npy_math_internal.h.src causes undefined behavior when a = INT_MIN because negating INT_MIN overflows a signed integer on s390x. i see it is working fine with other arch so fix only provided to s390x
|
||||||
|
---
|
||||||
|
numpy/_core/src/npymath/npy_math_internal.h.src | 11 ++++++++++-
|
||||||
|
numpy/_core/tests/test_umath.py | 12 ++++++++----
|
||||||
|
2 files changed, 18 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/numpy/_core/src/npymath/npy_math_internal.h.src b/numpy/_core/src/npymath/npy_math_internal.h.src
|
||||||
|
index 2f38497..787f7e6 100644
|
||||||
|
--- a/numpy/_core/src/npymath/npy_math_internal.h.src
|
||||||
|
+++ b/numpy/_core/src/npymath/npy_math_internal.h.src
|
||||||
|
@@ -650,12 +650,21 @@ npy_lcm@c@(@type@ a, @type@ b)
|
||||||
|
*
|
||||||
|
* #type = (npy_int, npy_long, npy_longlong)*2#
|
||||||
|
* #c = (,l,ll)*2#
|
||||||
|
+ * #utype = (npy_uint, npy_ulong, npy_ulonglong)*2#
|
||||||
|
* #func=gcd*3,lcm*3#
|
||||||
|
*/
|
||||||
|
NPY_INPLACE @type@
|
||||||
|
npy_@func@@c@(@type@ a, @type@ b)
|
||||||
|
{
|
||||||
|
- return npy_@func@u@c@(a < 0 ? -a : a, b < 0 ? -b : b);
|
||||||
|
+ /*
|
||||||
|
+ * Cast to unsigned to avoid overflow when negating minimum signed value.
|
||||||
|
+ * For negative values, cast to unsigned first, then apply negation in
|
||||||
|
+ * unsigned arithmetic to avoid undefined behavior.
|
||||||
|
+ * This ensures correct behavior across all architectures. #31359
|
||||||
|
+ */
|
||||||
|
+ @utype@ a_abs = a < 0 ? (@utype@)(0) - (@utype@)a : (@utype@)a;
|
||||||
|
+ @utype@ b_abs = b < 0 ? (@utype@)(0) - (@utype@)b : (@utype@)b;
|
||||||
|
+ return (@type@)npy_@func@u@c@(a_abs, b_abs);
|
||||||
|
}
|
||||||
|
/**end repeat**/
|
||||||
|
|
||||||
|
diff --git a/numpy/_core/tests/test_umath.py b/numpy/_core/tests/test_umath.py
|
||||||
|
index 8eac236..1575dd6 100644
|
||||||
|
--- a/numpy/_core/tests/test_umath.py
|
||||||
|
+++ b/numpy/_core/tests/test_umath.py
|
||||||
|
@@ -4131,13 +4131,17 @@ def test_lcm_overflow(self):
|
||||||
|
assert_equal(np.lcm(a, b), 10 * big)
|
||||||
|
|
||||||
|
def test_gcd_overflow(self):
|
||||||
|
- for dtype in (np.int32, np.int64):
|
||||||
|
- # verify that we don't overflow when taking abs(x)
|
||||||
|
- # not relevant for lcm, where the result is unrepresentable anyway
|
||||||
|
- a = dtype(np.iinfo(dtype).min) # negative power of two
|
||||||
|
+ # verify that we don't overflow when taking abs(x) for INT_MIN
|
||||||
|
+ # this was undefined behavior that manifested on s390x with GCC 11.5
|
||||||
|
+ for dtype in (np.int8, np.int16, np.int32, np.int64):
|
||||||
|
+ a = dtype(np.iinfo(dtype).min) # INT_MIN
|
||||||
|
q = -(a // 4)
|
||||||
|
+ # Test with INT_MIN as first argument
|
||||||
|
assert_equal(np.gcd(a, q * 3), q)
|
||||||
|
assert_equal(np.gcd(a, -q * 3), q)
|
||||||
|
+ # Test with INT_MIN as second argument
|
||||||
|
+ assert_equal(np.gcd(q * 3, a), q)
|
||||||
|
+ assert_equal(np.gcd(-q * 3, a), q)
|
||||||
|
|
||||||
|
def test_decimal(self):
|
||||||
|
from decimal import Decimal
|
||||||
|
--
|
||||||
|
2.54.0
|
||||||
|
|
||||||
@ -48,6 +48,11 @@ Patch: coverity-fixes.patch
|
|||||||
# Sent upstream: https://github.com/numpy/numpy/pull/31333
|
# Sent upstream: https://github.com/numpy/numpy/pull/31333
|
||||||
Patch: fix-test_validate_transcendentals-x86_64.patch
|
Patch: fix-test_validate_transcendentals-x86_64.patch
|
||||||
|
|
||||||
|
# Fix signed overflow issue in npy_gcd for INT_MIN on s390x
|
||||||
|
# Resolved upstream:
|
||||||
|
# https://github.com/numpy/numpy/pull/31360
|
||||||
|
Patch: fix-signed-overflow-s390x.patch
|
||||||
|
|
||||||
BuildRequires: python%{python3_pkgversion}-devel
|
BuildRequires: python%{python3_pkgversion}-devel
|
||||||
BuildRequires: gcc-gfortran gcc gcc-c++
|
BuildRequires: gcc-gfortran gcc gcc-c++
|
||||||
BuildRequires: lapack-devel
|
BuildRequires: lapack-devel
|
||||||
@ -246,7 +251,8 @@ export PYTHONPATH=%{buildroot}%{python3_sitearch}
|
|||||||
* Tue Jul 07 2026 Charalampos Stratakis <cstratak@redhat.com> - 2.3.4-2
|
* Tue Jul 07 2026 Charalampos Stratakis <cstratak@redhat.com> - 2.3.4-2
|
||||||
- Fix issues identified via Coverity static analysis
|
- Fix issues identified via Coverity static analysis
|
||||||
- Fix test_validate_transcendentals skip to match SVML dispatch
|
- Fix test_validate_transcendentals skip to match SVML dispatch
|
||||||
- Fixes: RHEL-193002, RHEL-193001
|
- Fix signed overflow issue in npy_gcd for INT_MIN on s390x
|
||||||
|
- Fixes: RHEL-193002, RHEL-193001, RHEL-193000
|
||||||
|
|
||||||
* Thu Oct 23 2025 Tomáš Hrnčiar <thrnciar@redhat.com> - 2.3.4-1
|
* Thu Oct 23 2025 Tomáš Hrnčiar <thrnciar@redhat.com> - 2.3.4-1
|
||||||
- Initial import
|
- Initial import
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user