]> granicus.if.org Git - python/commitdiff
bpo-32713: Fix tarfile.itn for large/negative float values. (GH-5434)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 27 Feb 2018 01:11:01 +0000 (17:11 -0800)
committerGitHub <noreply@github.com>
Tue, 27 Feb 2018 01:11:01 +0000 (17:11 -0800)
(cherry picked from commit 72d9b2be36f091793ae7ffc5ad751f040c6e6ad3)

Co-authored-by: Joffrey F <f.joffrey@gmail.com>
Lib/tarfile.py
Lib/test/test_tarfile.py
Misc/NEWS.d/next/Library/2018-02-26-13-16-36.bpo-32713.55yegW.rst [new file with mode: 0644]

index 631b69dcba4f418420247f85f9802cb599439ab1..395b846ee2c409b1c138a61c4a63726a99c662c2 100755 (executable)
@@ -202,8 +202,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])
index fc79055421161c917fab9e4f3e6b70637d818444..4cd7d5370f58d6fa3be8eada818fd3dc5b42bd42 100644 (file)
@@ -2146,6 +2146,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 (file)
index 0000000..bb5d64a
--- /dev/null
@@ -0,0 +1 @@
+Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey Fuhrer.