From 36e33a20995505e04667e8b9adb263e0324d229c Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Wed, 3 Jun 2026 06:13:42 +0300 Subject: [PATCH] Correct overflow case for negatives in zz_get_bytes() Closes #337 (cherry picked from commit 65dd5bcbf0e79797c545d8ea5775ecc2359fe459) --- gmp.c | 6 +----- tests/test_mpz.py | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/gmp.c b/gmp.c index b3f0b01a..3b65cc6f 100644 --- a/gmp.c +++ b/gmp.c @@ -356,10 +356,6 @@ zz_get_bytes(const zz_t *u, size_t length, bool is_signed, if (!is_signed) { return ZZ_BUF; } - if (8*length/bits_per_digit + 1 < u->size) { - zz_clear(&tmp); - return ZZ_BUF; - } if (zz_set(1, &tmp) || zz_mul_2exp(&tmp, 8*length, &tmp) || zz_add(&tmp, u, &tmp)) { @@ -373,7 +369,7 @@ zz_get_bytes(const zz_t *u, size_t length, bool is_signed, size_t nbits = zz_bitlen(u); - if (nbits > 8*length + if (zz_isneg(u) || nbits > 8*length || (is_signed && ((!nbits && is_negative) || (nbits && (nbits == 8 * length ? !is_negative : is_negative))))) { diff --git a/tests/test_mpz.py b/tests/test_mpz.py index bac29f57..5d0090e0 100644 --- a/tests/test_mpz.py +++ b/tests/test_mpz.py @@ -842,6 +842,7 @@ def test_methods(x): @example(-65281, 3, "little", True) @example(128, 1, "big", False) @example(-32383289396013590652, 0, "big", True) +@example(-384, 1, "big", True) def test_to_bytes_bulk(x, length, byteorder, signed): try: rx = x.to_bytes(length, byteorder, signed=signed)