[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