
python-checkins at python
Nov 7, 2009, 4:20 PM
Post #1 of 1
(33 views)
Permalink
|
|
r76147 - in python/branches/release31-maint: Lib/importlib/_bootstrap.py Lib/importlib/test/source/test_file_loader.py Misc/ACKS Misc/NEWS
|
|
Author: brett.cannon Date: Sun Nov 8 00:57:20 2009 New Revision: 76147 Log: Merged revisions 76146 via svnmerge from svn+ssh://pythondev[at]svn.python.org/python/branches/py3k ........ r76146 | brett.cannon | 2009-11-07 15:55:05 -0800 (Sat, 07 Nov 2009) | 6 lines When trying to write new bytecode, importlib was not catching the IOError thrown if the file happened to be read-only to keep the failure silent. Fixes issue #7187. Thanks, Dave Malcolm for the report and analysis of the problem. ........ Modified: python/branches/release31-maint/ (props changed) python/branches/release31-maint/Lib/importlib/_bootstrap.py python/branches/release31-maint/Lib/importlib/test/source/test_file_loader.py python/branches/release31-maint/Misc/ACKS python/branches/release31-maint/Misc/NEWS Modified: python/branches/release31-maint/Lib/importlib/_bootstrap.py ============================================================================== --- python/branches/release31-maint/Lib/importlib/_bootstrap.py (original) +++ python/branches/release31-maint/Lib/importlib/_bootstrap.py Sun Nov 8 00:57:20 2009 @@ -522,9 +522,9 @@ bytecode_path = self.bytecode_path(name) if not bytecode_path: bytecode_path = self._base_path + _suffix_list(imp.PY_COMPILED)[0] - file = _io.FileIO(bytecode_path, 'w') # Assuming bytes. try: - with _closing(file) as bytecode_file: + # Assuming bytes. + with _closing(_io.FileIO(bytecode_path, 'w')) as bytecode_file: bytecode_file.write(data) return True except IOError as exc: Modified: python/branches/release31-maint/Lib/importlib/test/source/test_file_loader.py ============================================================================== --- python/branches/release31-maint/Lib/importlib/test/source/test_file_loader.py (original) +++ python/branches/release31-maint/Lib/importlib/test/source/test_file_loader.py Sun Nov 8 00:57:20 2009 @@ -6,6 +6,7 @@ import imp import os import py_compile +import stat import sys import unittest @@ -119,6 +120,10 @@ But if the marshal data is bad, even if the magic number and timestamp work, a ValueError is raised and the source is not used [bad marshal]. + The case of not being able to write out the bytecode must also be handled + as it's possible it was made read-only. In that instance the attempt to + write the bytecode should fail silently [bytecode read-only]. + """ def import_(self, file, module_name): @@ -157,6 +162,7 @@ self.assertEqual(bytecode_file.read(4), source_timestamp) # [bad marshal] + @source_util.writes_bytecode_files def test_bad_marshal(self): with source_util.create_modules('_temp') as mapping: bytecode_path = source_util.bytecode_path(mapping['_temp']) @@ -170,6 +176,26 @@ '_temp') self.assertTrue('_temp' not in sys.modules) + # [bytecode read-only] + @source_util.writes_bytecode_files + def test_read_only_bytecode(self): + with source_util.create_modules('_temp') as mapping: + # Create bytecode that will need to be re-created. + py_compile.compile(mapping['_temp']) + bytecode_path = source_util.bytecode_path(mapping['_temp']) + with open(bytecode_path, 'r+b') as bytecode_file: + bytecode_file.seek(0) + bytecode_file.write(b'\x00\x00\x00\x00') + # Make the bytecode read-only. + os.chmod(bytecode_path, + stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) + try: + # Should not raise IOError! + self.import_(mapping['_temp'], '_temp') + finally: + # Make writable for eventual clean-up. + os.chmod(bytecode_path, stat.S_IWUSR) + def test_main(): from test.support import run_unittest Modified: python/branches/release31-maint/Misc/ACKS ============================================================================== --- python/branches/release31-maint/Misc/ACKS (original) +++ python/branches/release31-maint/Misc/ACKS Sun Nov 8 00:57:20 2009 @@ -466,6 +466,7 @@ Don MacMillen Steve Majewski Grzegorz Makarewicz +Dave Malcolm Ken Manheimer Vladimir Marangozov David Marek Modified: python/branches/release31-maint/Misc/NEWS ============================================================================== --- python/branches/release31-maint/Misc/NEWS (original) +++ python/branches/release31-maint/Misc/NEWS Sun Nov 8 00:57:20 2009 @@ -40,6 +40,9 @@ Library ------- +- Issue #7187: Importlib would not silence the IOError raised when trying to + write new bytecode when it was made read-only. + - Issue #7264: Fix a possible deadlock when deallocating thread-local objects which are part of a reference cycle. _______________________________________________ Python-checkins mailing list Python-checkins[at]python.org http://mail.python.org/mailman/listinfo/python-checkins
|