From: Joffrey F Date: Tue, 27 Feb 2018 00:02:21 +0000 (-0800) Subject: bpo-32713: Fix tarfile.itn for large/negative float values. (GH-5434) X-Git-Tag: v3.8.0a1~2153 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72d9b2be36f091793ae7ffc5ad751f040c6e6ad3;p=python bpo-32713: Fix tarfile.itn for large/negative float values. (GH-5434) --- diff --git a/Lib/tarfile.py b/Lib/tarfile.py index a24ee42abf..85119a48a4 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -200,8 +200,9 @@ def itn(n, digits=8, format=DEFAULT_FORMAT): # base-256 representation. This allows values up to (256**(digits-1))-1. # A 0o200 byte indicates a positive number, a 0o377 byte a negative # number. + n = int(n) 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): if n >= 0: s = bytearray([0o200]) diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index b868326d5c..7d2eec8a7c 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -2149,6 +2149,14 @@ class MiscTest(unittest.TestCase): self.assertEqual(tarfile.itn(-0x100000000000000), 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): with self.assertRaises(ValueError): tarfile.itn(-1, 8, tarfile.USTAR_FORMAT) diff --git a/Misc/NEWS.d/next/Library/2018-02-26-13-16-36.bpo-32713.55yegW.rst b/Misc/NEWS.d/next/Library/2018-02-26-13-16-36.bpo-32713.55yegW.rst new file mode 100644 index 0000000000..bb5d64a351 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-02-26-13-16-36.bpo-32713.55yegW.rst @@ -0,0 +1 @@ +Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey Fuhrer.