]> granicus.if.org Git - python/commitdiff
Issue #11235: Fix OverflowError when trying to import a source file whose modificatio...
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 24 Jan 2012 16:44:06 +0000 (17:44 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 24 Jan 2012 16:44:06 +0000 (17:44 +0100)
Lib/importlib/test/source/test_file_loader.py
Lib/test/test_import.py
Misc/NEWS
Python/import.c

index de1c4d8a014aae1cec55c588791a5e34a400ecb8..89990be9da92f4267e68eb63134eaadc8cc2c935 100644 (file)
@@ -128,6 +128,23 @@ class SimpleTest(unittest.TestCase):
             pycache = os.path.dirname(imp.cache_from_source(file_path))
             shutil.rmtree(pycache)
 
+    def test_timestamp_overflow(self):
+        # When a modification timestamp is larger than 2**32, it should be
+        # truncated rather than raise an OverflowError.
+        with source_util.create_modules('_temp') as mapping:
+            source = mapping['_temp']
+            compiled = imp.cache_from_source(source)
+            with open(source, 'w') as f:
+                f.write("x = 5")
+            os.utime(source, (2 ** 33, 2 ** 33))
+            loader = _bootstrap._SourceFileLoader('_temp', mapping['_temp'])
+            mod = loader.load_module('_temp')
+            # Sanity checks.
+            self.assertEqual(mod.__cached__, compiled)
+            self.assertEqual(mod.x, 5)
+            # The pyc file was created.
+            os.stat(compiled)
+
 
 class BadBytecodeTest(unittest.TestCase):
 
index c69575729d68f816def2904ed63d5213de5b42ef..33277d7a6704a99519104fe2f203eb2a90cb027a 100644 (file)
@@ -310,6 +310,18 @@ class ImportTests(unittest.TestCase):
             """))
         script_helper.assert_python_ok(testfn)
 
+    def test_timestamp_overflow(self):
+        # A modification timestamp larger than 2**32 should not be a problem
+        # when importing a module (issue #11235).
+        source = TESTFN + ".py"
+        compiled = imp.cache_from_source(source)
+        with open(source, 'w') as f:
+            pass
+        os.utime(source, (2 ** 33, 2 ** 33))
+        __import__(TESTFN)
+        # The pyc file was created.
+        os.stat(compiled)
+
 
 class PycRewritingTests(unittest.TestCase):
     # Test that the `co_filename` attribute on code objects always points
index 3b0752e8ce3ff999d34bcb442e8192e6b7f761e8..5e2c47ee04404af23d2d90e7cc1316c565ccc67d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.2.3?
 Core and Builtins
 -----------------
 
+- Issue #11235: Fix OverflowError when trying to import a source file whose
+  modification time doesn't fit in a 32-bit timestamp.
+
 - Fix the builtin module initialization code to store the init function for
   future reinitialization.
 
index ee3f9b0682f91c1c16320ce785abcce55a40d30d..40b8d0a55835dd75cbf5ac8e790c1aa5ef179c9e 100644 (file)
@@ -1304,14 +1304,11 @@ load_source_module(char *name, char *pathname, FILE *fp)
     }
 #if SIZEOF_TIME_T > 4
     /* Python's .pyc timestamp handling presumes that the timestamp fits
-       in 4 bytes. This will be fine until sometime in the year 2038,
-       when a 4-byte signed time_t will overflow.
+       in 4 bytes. Since the code only does an equality comparison,
+       ordering is not important and we can safely ignore the higher bits
+       (collisions are extremely unlikely).
      */
-    if (st.st_mtime >> 32) {
-        PyErr_SetString(PyExc_OverflowError,
-            "modification time overflows a 4 byte field");
-        return NULL;
-    }
+    st.st_mtime &= 0xFFFFFFFF;
 #endif
     cpathname = make_compiled_pathname(
         pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag);