[Python-checkins] r69482 - in python/branches/py3k: Lib/compileall.py Lib/test/test_compileall.py Misc/ACKS Misc/NEWS

brett.cannon python-checkins at python.org
Tue Feb 10 03:10:16 CET 2009


Author: brett.cannon
Date: Tue Feb 10 03:10:16 2009
New Revision: 69482

Log:
Merged revisions 69481 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r69481 | brett.cannon | 2009-02-09 18:07:38 -0800 (Mon, 09 Feb 2009) | 4 lines
  
  compileall used the ctime of bytecode and source to determine if the bytecode
  should be recreated. This created a timing hole. Fixed by just doing what
  import does; check the mtime and magic number.
........


Added:
   python/branches/py3k/Lib/test/test_compileall.py
      - copied, changed from r69481, /python/trunk/Lib/test/test_compileall.py
Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/compileall.py
   python/branches/py3k/Misc/ACKS
   python/branches/py3k/Misc/NEWS

Modified: python/branches/py3k/Lib/compileall.py
==============================================================================
--- python/branches/py3k/Lib/compileall.py	(original)
+++ python/branches/py3k/Lib/compileall.py	Tue Feb 10 03:10:16 2009
@@ -11,10 +11,11 @@
 See module py_compile for details of the actual byte-compilation.
 
 """
-
 import os
 import sys
 import py_compile
+import struct
+import imp
 
 __all__ = ["compile_dir","compile_path"]
 
@@ -54,11 +55,17 @@
         if os.path.isfile(fullname):
             head, tail = name[:-3], name[-3:]
             if tail == '.py':
-                cfile = fullname + (__debug__ and 'c' or 'o')
-                ftime = os.stat(fullname).st_mtime
-                try: ctime = os.stat(cfile).st_mtime
-                except os.error: ctime = 0
-                if (ctime > ftime) and not force: continue
+                if not force:
+                    try:
+                        mtime = os.stat(fullname).st_mtime
+                        expect = struct.pack('<4sl', imp.get_magic(), mtime)
+                        cfile = fullname + (__debug__ and 'c' or 'o')
+                        with open(cfile, 'rb') as chandle:
+                            actual = chandle.read(8)
+                        if expect == actual:
+                            continue
+                    except IOError:
+                        pass
                 if not quiet:
                     print('Compiling', fullname, '...')
                 try:
@@ -86,7 +93,8 @@
              name != os.curdir and name != os.pardir and \
              os.path.isdir(fullname) and \
              not os.path.islink(fullname):
-            if not compile_dir(fullname, maxlevels - 1, dfile, force, rx, quiet):
+            if not compile_dir(fullname, maxlevels - 1, dfile, force, rx,
+                               quiet):
                 success = 0
     return success
 

Copied: python/branches/py3k/Lib/test/test_compileall.py (from r69481, /python/trunk/Lib/test/test_compileall.py)
==============================================================================
--- /python/trunk/Lib/test/test_compileall.py	(original)
+++ python/branches/py3k/Lib/test/test_compileall.py	Tue Feb 10 03:10:16 2009
@@ -7,7 +7,7 @@
 import sys
 import tempfile
 import time
-from test import test_support
+from test import support
 import unittest
 
 
@@ -56,7 +56,7 @@
 
 
 def test_main():
-    test_support.run_unittest(CompileallTests)
+    support.run_unittest(CompileallTests)
 
 
 if __name__ == "__main__":

Modified: python/branches/py3k/Misc/ACKS
==============================================================================
--- python/branches/py3k/Misc/ACKS	(original)
+++ python/branches/py3k/Misc/ACKS	Tue Feb 10 03:10:16 2009
@@ -183,7 +183,7 @@
 Andy Dustman
 Gary Duzan
 Eugene Dvurechenski
-Josip Dzolonga 
+Josip Dzolonga
 Maxim Dzumanenko
 Walter Dörwald
 Hans Eckardt
@@ -234,6 +234,7 @@
 Ulisses Furquim
 Hagen Fürstenau
 Achim Gaedke
+Martin von Gagern
 Lele Gaifax
 Santiago Gala
 Yitzchak Gale

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Tue Feb 10 03:10:16 2009
@@ -163,6 +163,10 @@
 Library
 -------
 
+- Issue #5128: Make compileall properly inspect bytecode to determine if needs
+  to be recreated. This avoids a timing hole thanks to the old reliance on the
+  ctime of the files involved.
+
 - Issue #5122: Synchronize tk load failure check to prevent a potential
   deadlock.
 


More information about the Python-checkins mailing list