diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-08-24 15:09:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-24 15:09:14 (GMT) |
commit | 0af681b652c43f0ba90988400ecc1e7934fbfc5d (patch) | |
tree | 1186f88abde9b8f61bd495590b3b1d194cb26be0 /Lib/test/test_compileall.py | |
parent | 4673dc26f8beab50b4d4046ece720933401a4023 (diff) | |
download | cpython-0af681b652c43f0ba90988400ecc1e7934fbfc5d.zip cpython-0af681b652c43f0ba90988400ecc1e7934fbfc5d.tar.gz cpython-0af681b652c43f0ba90988400ecc1e7934fbfc5d.tar.bz2 |
[3.10] bpo-34990: Treat the pyc header's mtime in compileall as an unsigned int (GH-19708)
(cherry picked from commit bb21e28fd08f894ceff2405544a2f257d42b1354)
Co-authored-by: Ammar Askar <ammar@ammaraskar.com>
Co-authored-by: Stéphane Wirtel <stephane@wirtel.be>
Diffstat (limited to 'Lib/test/test_compileall.py')
-rw-r--r-- | Lib/test/test_compileall.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 4612953..cc51b8c 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -80,9 +80,28 @@ class CompileallTestsBase: with open(self.bc_path, 'rb') as file: data = file.read(12) mtime = int(os.stat(self.source_path).st_mtime) - compare = struct.pack('<4sll', importlib.util.MAGIC_NUMBER, 0, mtime) + compare = struct.pack('<4sLL', importlib.util.MAGIC_NUMBER, 0, + mtime & 0xFFFF_FFFF) return data, compare + def test_year_2038_mtime_compilation(self): + # Test to make sure we can handle mtimes larger than what a 32-bit + # signed number can hold as part of bpo-34990 + try: + os.utime(self.source_path, (2**32 - 1, 2**32 - 1)) + except (OverflowError, OSError): + self.skipTest("filesystem doesn't support timestamps near 2**32") + self.assertTrue(compileall.compile_file(self.source_path)) + + def test_larger_than_32_bit_times(self): + # This is similar to the test above but we skip it if the OS doesn't + # support modification times larger than 32-bits. + try: + os.utime(self.source_path, (2**35, 2**35)) + except (OverflowError, OSError): + self.skipTest("filesystem doesn't support large timestamps") + self.assertTrue(compileall.compile_file(self.source_path)) + def recreation_check(self, metadata): """Check that compileall recreates bytecode when the new metadata is used.""" @@ -101,7 +120,7 @@ class CompileallTestsBase: def test_mtime(self): # Test a change in mtime leads to a new .pyc. - self.recreation_check(struct.pack('<4sll', importlib.util.MAGIC_NUMBER, + self.recreation_check(struct.pack('<4sLL', importlib.util.MAGIC_NUMBER, 0, 1)) def test_magic_number(self): |