From 076217856e246a9eed9e8bafafa4876f70980860 Mon Sep 17 00:00:00 2001 From: Haixiao Yan Date: Mon, 3 Nov 2025 21:56:44 +0800 Subject: [PATCH] python3-m2crypto: correct struct packing on 32-bit with _TIME_BITS=64 Fixes: # python3 -munittest -v test_ssl.MiscSSLClientTestCase.test_server_simple_timeouts test_server_simple_timeouts (test_ssl.MiscSSLClientTestCase.test_server_simple_timeouts) ... ERROR ====================================================================== ERROR: test_server_simple_timeouts (test_ssl.MiscSSLClientTestCase.test_server_simple_timeouts) ---------------------------------------------------------------------- Traceback (most recent call last): File "/opt/python3-m2crypto/tests/test_ssl.py", line 474, in test_server_simple_timeouts s.set_socket_read_timeout(SSL.timeout()) ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^ File "/usr/lib/python3.13/site-packages/M2Crypto/SSL/Connection.py", line 680, in set_socket_read_timeout self.socket.setsockopt( ~~~~~~~~~~~~~~~~~~~~~~^ socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeo.pack() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ OSError: [Errno 22] Invalid argument Signed-off-by: Haixiao Yan Signed-off-by: Khem Raj --- ...-time_t-on-32-bit-systems-in-test_is.patch | 40 +++++++++++ ...ct-packing-on-32-bit-with-_TIME_BITS.patch | 72 +++++++++++++++++++ .../python/python3-m2crypto_0.46.2.bb | 2 + 3 files changed, 114 insertions(+) create mode 100644 meta-python/recipes-devtools/python/python3-m2crypto/0001-fix-allow-64-bit-time_t-on-32-bit-systems-in-test_is.patch create mode 100644 meta-python/recipes-devtools/python/python3-m2crypto/0002-fix-correct-struct-packing-on-32-bit-with-_TIME_BITS.patch diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/0001-fix-allow-64-bit-time_t-on-32-bit-systems-in-test_is.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0001-fix-allow-64-bit-time_t-on-32-bit-systems-in-test_is.patch new file mode 100644 index 0000000000..d49950074f --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-m2crypto/0001-fix-allow-64-bit-time_t-on-32-bit-systems-in-test_is.patch @@ -0,0 +1,40 @@ +From d123b4ddce99c44f2c290fb3d6cc887de98778e6 Mon Sep 17 00:00:00 2001 +From: Haixiao Yan +Date: Wed, 22 Oct 2025 15:23:56 +0800 +Subject: [PATCH 1/2] fix: allow 64-bit time_t on 32-bit systems in + test_is32bit + +Some modern 32-bit Linux systems (e.g. with glibc >= 2.34 or musl time64 ABI) +use 64-bit time_t by default when _TIME_BITS=64 is enabled. The original test +assumed time_t was always 32-bit on 32-bit architectures, which is no longer +true. + +Relax the check to accept both 32-bit and 64-bit time_t values: + + self.assertIn(bit32, (32, 64)) + +This makes the test compatible with both legacy and time64 ABIs. + +Upstream-Status: Backport [https://gitlab.com/m2crypto/m2crypto/-/commit/818c3dfda6ea] + +Signed-off-by: Haixiao Yan +--- + tests/test_util.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/test_util.py b/tests/test_util.py +index e925d03b090c..233fb7a099d9 100644 +--- a/tests/test_util.py ++++ b/tests/test_util.py +@@ -26,7 +26,7 @@ class UtilTestCase(unittest.TestCase): + not in ["true", "1", "yes"] + ) + ): +- self.assertEqual(bit32, 32) ++ self.assertIn(bit32, (32, 64)) + else: + self.assertNotEqual(bit32, 32) + self.assertIsInstance(bit32, int) +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-m2crypto/0002-fix-correct-struct-packing-on-32-bit-with-_TIME_BITS.patch b/meta-python/recipes-devtools/python/python3-m2crypto/0002-fix-correct-struct-packing-on-32-bit-with-_TIME_BITS.patch new file mode 100644 index 0000000000..c36afa5cc0 --- /dev/null +++ b/meta-python/recipes-devtools/python/python3-m2crypto/0002-fix-correct-struct-packing-on-32-bit-with-_TIME_BITS.patch @@ -0,0 +1,72 @@ +From b5dbfca23986429853ccb15a38cc526d9df0dd40 Mon Sep 17 00:00:00 2001 +From: Haixiao Yan +Date: Wed, 22 Oct 2025 15:23:57 +0800 +Subject: [PATCH 2/2] fix: correct struct packing on 32-bit with _TIME_BITS=64 + +On 32-bit platforms with glibc time64 ABI, time_t is 64-bit wide while +`long` remains 32-bit. This causes struct timeval to use two 64-bit fields +(tv_sec, tv_usec). The previous code incorrectly packed timeout as "ll", +leading to EINVAL in setsockopt(SO_RCVTIMEO). + +Use "qq" instead when m2.time_t_bits() == 64 to match the actual ABI. + +Fixes: https://todo.sr.ht/~mcepl/m2crypto/374 + +Upstream-Status: Backport [https://gitlab.com/m2crypto/m2crypto/-/commit/473de659f78e] + +Signed-off-by: Haixiao Yan +--- + src/M2Crypto/SSL/timeout.py | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +diff --git a/src/M2Crypto/SSL/timeout.py b/src/M2Crypto/SSL/timeout.py +index b45f38b1cbdb..5ba52283b6f8 100644 +--- a/src/M2Crypto/SSL/timeout.py ++++ b/src/M2Crypto/SSL/timeout.py +@@ -33,10 +33,14 @@ class timeout(object): + millisec = int(self.sec * 1000 + round(float(self.microsec) / 1000)) + binstr = struct.pack("l", millisec) + else: +- if m2.time_t_bits() == 32: ++ bits = m2.time_t_bits() ++ if bits == 32: + binstr = struct.pack("ii", self.sec, self.microsec) ++ elif bits == 64: ++ # handle both 64-bit and 32-bit+TIME_BITS=64 ++ binstr = struct.pack("qq", self.sec, self.microsec) + else: +- binstr = struct.pack("ll", self.sec, self.microsec) ++ raise ValueError(f"Unsupported time_t_bits: {bits}") + return binstr + + +@@ -48,7 +52,13 @@ def struct_to_timeout(binstr: bytes) -> timeout: + sec = int(millisec / 1000) + microsec = (millisec % 1000) * 1000 + else: +- (sec, microsec) = struct.unpack("ll", binstr) ++ bits = m2.time_t_bits() ++ if bits == 32: ++ (sec, microsec) = struct.unpack("ii", binstr) ++ elif bits == 64: ++ (sec, microsec) = struct.unpack("qq", binstr) ++ else: ++ raise ValueError(f"Unsupported time_t_bits: {bits}") + return timeout(sec, microsec) + + +@@ -56,4 +66,10 @@ def struct_size() -> int: + if sys.platform == "win32": + return struct.calcsize("l") + else: +- return struct.calcsize("ll") ++ bits = m2.time_t_bits() ++ if bits == 32: ++ return struct.calcsize("ii") ++ elif bits == 64: ++ return struct.calcsize("qq") ++ else: ++ raise ValueError(f"Unsupported time_t_bits: {bits}") +-- +2.34.1 + diff --git a/meta-python/recipes-devtools/python/python3-m2crypto_0.46.2.bb b/meta-python/recipes-devtools/python/python3-m2crypto_0.46.2.bb index 0a631c7a07..9aac7b344f 100644 --- a/meta-python/recipes-devtools/python/python3-m2crypto_0.46.2.bb +++ b/meta-python/recipes-devtools/python/python3-m2crypto_0.46.2.bb @@ -8,6 +8,8 @@ SRC_URI[sha256sum] = "13c2fa89562f7b8af40cc74b55f490be5e2ab8ccfb739f11c16d3ce622 SRC_URI += " \ file://0001-setup.py-Make-the-cmd-available.patch \ + file://0001-fix-allow-64-bit-time_t-on-32-bit-systems-in-test_is.patch \ + file://0002-fix-correct-struct-packing-on-32-bit-with-_TIME_BITS.patch \ " inherit pypi siteinfo python_setuptools_build_meta