Issue #12004: Fix an internal error in PyZipFile when writing an invalid

Python file.  Patch by Ben Morgan.
This commit is contained in:
Serhiy Storchaka 2013-01-29 20:14:08 +02:00
commit c5b75db5de
4 changed files with 30 additions and 2 deletions

View File

@ -13,7 +13,9 @@ from tempfile import TemporaryFile
from random import randint, random from random import randint, random
from unittest import skipUnless from unittest import skipUnless
from test.support import TESTFN, run_unittest, findfile, unlink, requires_zlib, requires_bz2, requires_lzma from test.support import (TESTFN, run_unittest, findfile, unlink,
requires_zlib, requires_bz2, requires_lzma,
captured_stdout)
TESTFN2 = TESTFN + "2" TESTFN2 = TESTFN + "2"
TESTFNDIR = TESTFN + "d" TESTFNDIR = TESTFN + "d"
@ -854,6 +856,28 @@ class PyZipFileTests(unittest.TestCase):
self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) self.assertRaises(RuntimeError, zipfp.writepy, TESTFN)
os.remove(TESTFN) os.remove(TESTFN)
def test_write_pyfile_bad_syntax(self):
os.mkdir(TESTFN2)
try:
with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp:
fp.write("Bad syntax in python file\n")
with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
# syntax errors are printed to stdout
with captured_stdout() as s:
zipfp.writepy(os.path.join(TESTFN2, "mod1.py"))
self.assertIn("SyntaxError", s.getvalue())
# as it will not have compiled the python file, it will
# include the .py file not .pyc or .pyo
names = zipfp.namelist()
self.assertIn('mod1.py', names)
self.assertNotIn('mod1.pyc', names)
self.assertNotIn('mod1.pyo', names)
finally:
shutil.rmtree(TESTFN2)
class OtherTests(unittest.TestCase): class OtherTests(unittest.TestCase):
zips_with_bad_crc = { zips_with_bad_crc = {

View File

@ -1604,7 +1604,7 @@ class PyZipFile(ZipFile):
print("Compiling", file) print("Compiling", file)
try: try:
py_compile.compile(file, doraise=True, optimize=optimize) py_compile.compile(file, doraise=True, optimize=optimize)
except py_compile.PyCompileError as error: except py_compile.PyCompileError as err:
print(err.msg) print(err.msg)
return False return False
return True return True

View File

@ -818,6 +818,7 @@ Skip Montanaro
Peter Moody Peter Moody
Paul Moore Paul Moore
Ross Moore Ross Moore
Ben Morgan
Derek Morr Derek Morr
James A Morrison James A Morrison
Derek McTavish Mounce Derek McTavish Mounce

View File

@ -164,6 +164,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12004: Fix an internal error in PyZipFile when writing an invalid
Python file. Patch by Ben Morgan.
- Issue #1602133: on Mac OS X a shared library build (``--enable-shared``) - Issue #1602133: on Mac OS X a shared library build (``--enable-shared``)
now fills the ``os.environ`` variable correctly. now fills the ``os.environ`` variable correctly.