mirror of
https://github.com/python/cpython.git
synced 2026-01-04 06:22:20 +00:00
[3.13] gh-71810: Fix corner case (length==0) for int.to_bytes() (GH-138739) (#138783)
gh-71810: Fix corner case (length==0) for int.to_bytes() (GH-138739)
```pycon
>>> (0).to_bytes(0, 'big', signed=True)
b''
>>> (-1).to_bytes(0, 'big', signed=True) # was b''
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
(-1).to_bytes(0, 'big', signed=True)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
OverflowError: int too big to convert
```
(cherry picked from commit 011179a79a)
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
72b28cad91
commit
7195d7f3d4
3 changed files with 10 additions and 3 deletions
|
|
@ -1322,17 +1322,22 @@ def equivalent_python(n, length, byteorder, signed=False):
|
|||
check(tests4, 'little', signed=False)
|
||||
|
||||
self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False)
|
||||
self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True)
|
||||
self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False)
|
||||
self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True)
|
||||
self.assertRaises(OverflowError, (128).to_bytes, 1, 'big', signed=True)
|
||||
self.assertRaises(OverflowError, (128).to_bytes, 1, 'little', signed=True)
|
||||
self.assertRaises(OverflowError, (-129).to_bytes, 1, 'big', signed=True)
|
||||
self.assertRaises(OverflowError, (-129).to_bytes, 1, 'little', signed=True)
|
||||
self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False)
|
||||
self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False)
|
||||
self.assertEqual((0).to_bytes(0, 'big'), b'')
|
||||
self.assertEqual((0).to_bytes(0, 'big', signed=True), b'')
|
||||
self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01')
|
||||
self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00')
|
||||
self.assertEqual((-1).to_bytes(5, 'big', signed=True),
|
||||
b'\xff\xff\xff\xff\xff')
|
||||
self.assertRaises(OverflowError, (1).to_bytes, 0, 'big')
|
||||
self.assertRaises(OverflowError, (-1).to_bytes, 0, 'big', signed=True)
|
||||
self.assertRaises(OverflowError, (-1).to_bytes, 0, 'little', signed=True)
|
||||
|
||||
# gh-98783
|
||||
class SubStr(str):
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Raise :exc:`OverflowError` for ``(-1).to_bytes()`` for signed conversions
|
||||
when bytes count is zero. Patch by Sergey B Kirpichev.
|
||||
|
|
@ -1041,7 +1041,7 @@ _PyLong_AsByteArray(PyLongObject* v,
|
|||
*p = (unsigned char)(accum & 0xff);
|
||||
p += pincr;
|
||||
}
|
||||
else if (j == n && n > 0 && is_signed) {
|
||||
else if (j == n && is_signed) {
|
||||
/* The main loop filled the byte array exactly, so the code
|
||||
just above didn't get to ensure there's a sign bit, and the
|
||||
loop below wouldn't add one either. Make sure a sign bit
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue