bpo-32713: Fix tarfile.itn for large/negative float values. (GH-5434)
(cherry picked from commit 72d9b2be36
)
Co-authored-by: Joffrey F <f.joffrey@gmail.com>
This commit is contained in:
parent
51d95ffc2f
commit
a9a8a9814a
|
@ -200,8 +200,9 @@ def itn(n, digits=8, format=DEFAULT_FORMAT):
|
||||||
# base-256 representation. This allows values up to (256**(digits-1))-1.
|
# base-256 representation. This allows values up to (256**(digits-1))-1.
|
||||||
# A 0o200 byte indicates a positive number, a 0o377 byte a negative
|
# A 0o200 byte indicates a positive number, a 0o377 byte a negative
|
||||||
# number.
|
# number.
|
||||||
|
n = int(n)
|
||||||
if 0 <= n < 8 ** (digits - 1):
|
if 0 <= n < 8 ** (digits - 1):
|
||||||
s = bytes("%0*o" % (digits - 1, int(n)), "ascii") + NUL
|
s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL
|
||||||
elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1):
|
elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1):
|
||||||
if n >= 0:
|
if n >= 0:
|
||||||
s = bytearray([0o200])
|
s = bytearray([0o200])
|
||||||
|
|
|
@ -2149,6 +2149,14 @@ class MiscTest(unittest.TestCase):
|
||||||
self.assertEqual(tarfile.itn(-0x100000000000000),
|
self.assertEqual(tarfile.itn(-0x100000000000000),
|
||||||
b"\xff\x00\x00\x00\x00\x00\x00\x00")
|
b"\xff\x00\x00\x00\x00\x00\x00\x00")
|
||||||
|
|
||||||
|
# Issue 32713: Test if itn() supports float values outside the
|
||||||
|
# non-GNU format range
|
||||||
|
self.assertEqual(tarfile.itn(-100.0, format=tarfile.GNU_FORMAT),
|
||||||
|
b"\xff\xff\xff\xff\xff\xff\xff\x9c")
|
||||||
|
self.assertEqual(tarfile.itn(8 ** 12 + 0.0, format=tarfile.GNU_FORMAT),
|
||||||
|
b"\x80\x00\x00\x10\x00\x00\x00\x00")
|
||||||
|
self.assertEqual(tarfile.nti(tarfile.itn(-0.1, format=tarfile.GNU_FORMAT)), 0)
|
||||||
|
|
||||||
def test_number_field_limits(self):
|
def test_number_field_limits(self):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
tarfile.itn(-1, 8, tarfile.USTAR_FORMAT)
|
tarfile.itn(-1, 8, tarfile.USTAR_FORMAT)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey Fuhrer.
|
Loading…
Reference in New Issue