diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-10-31 16:17:36 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-10-31 16:17:36 (GMT) |
commit | 61d14b7659ebbe37f4eb77db909c4a34619f558e (patch) | |
tree | 547ef09cf60dad0d932c293fbd2b591d3136b9ec /Lib | |
parent | 9f3f9c512544be77f72a36c5077ab6d7d2a1a83e (diff) | |
download | cpython-61d14b7659ebbe37f4eb77db909c4a34619f558e.zip cpython-61d14b7659ebbe37f4eb77db909c4a34619f558e.tar.gz cpython-61d14b7659ebbe37f4eb77db909c4a34619f558e.tar.bz2 |
Merged revisions 86037 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r86037 | antoine.pitrou | 2010-10-31 17:04:14 +0100 (dim., 31 oct. 2010) | 4 lines
Issue #10266: uu.decode didn't close in_file explicitly when it was given
as a filename. Patch by Brian Brazil.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_uu.py | 17 | ||||
-rwxr-xr-x | Lib/uu.py | 107 |
2 files changed, 72 insertions, 52 deletions
diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index 25d9b60..95c9552 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -161,6 +161,23 @@ class UUFileTest(unittest.TestCase): finally: self._kill(f) + def test_decode_filename(self): + f = None + try: + test_support.unlink(self.tmpin) + f = open(self.tmpin, 'w') + f.write(encodedtextwrapped % (0644, self.tmpout)) + f.close() + + uu.decode(self.tmpin) + + f = open(self.tmpout, 'r') + s = f.read() + f.close() + self.assertEqual(s, plaintext) + finally: + self._kill(f) + def test_decodetwice(self): # Verify that decode() will refuse to overwrite an existing file f = None @@ -92,65 +92,68 @@ def decode(in_file, out_file=None, mode=None, quiet=0): # # Open the input file, if needed. # + opened_files = [] if in_file == '-': in_file = sys.stdin elif isinstance(in_file, basestring): in_file = open(in_file) - # - # Read until a begin is encountered or we've exhausted the file - # - while True: - hdr = in_file.readline() - if not hdr: - raise Error('No valid begin line found in input file') - if not hdr.startswith('begin'): - continue - hdrfields = hdr.split(' ', 2) - if len(hdrfields) == 3 and hdrfields[0] == 'begin': + opened_files.append(in_file) + try: + # + # Read until a begin is encountered or we've exhausted the file + # + while True: + hdr = in_file.readline() + if not hdr: + raise Error('No valid begin line found in input file') + if not hdr.startswith('begin'): + continue + hdrfields = hdr.split(' ', 2) + if len(hdrfields) == 3 and hdrfields[0] == 'begin': + try: + int(hdrfields[1], 8) + break + except ValueError: + pass + if out_file is None: + out_file = hdrfields[2].rstrip() + if os.path.exists(out_file): + raise Error('Cannot overwrite existing file: %s' % out_file) + if mode is None: + mode = int(hdrfields[1], 8) + # + # Open the output file + # + if out_file == '-': + out_file = sys.stdout + elif isinstance(out_file, basestring): + fp = open(out_file, 'wb') try: - int(hdrfields[1], 8) - break - except ValueError: + os.path.chmod(out_file, mode) + except AttributeError: pass - if out_file is None: - out_file = hdrfields[2].rstrip() - if os.path.exists(out_file): - raise Error('Cannot overwrite existing file: %s' % out_file) - if mode is None: - mode = int(hdrfields[1], 8) - # - # Open the output file - # - opened = False - if out_file == '-': - out_file = sys.stdout - elif isinstance(out_file, basestring): - fp = open(out_file, 'wb') - try: - os.path.chmod(out_file, mode) - except AttributeError: - pass - out_file = fp - opened = True - # - # Main decoding loop - # - s = in_file.readline() - while s and s.strip() != 'end': - try: - data = binascii.a2b_uu(s) - except binascii.Error, v: - # Workaround for broken uuencoders by /Fredrik Lundh - nbytes = (((ord(s[0])-32) & 63) * 4 + 5) // 3 - data = binascii.a2b_uu(s[:nbytes]) - if not quiet: - sys.stderr.write("Warning: %s\n" % v) - out_file.write(data) + out_file = fp + opened_files.append(out_file) + # + # Main decoding loop + # s = in_file.readline() - if not s: - raise Error('Truncated input file') - if opened: - out_file.close() + while s and s.strip() != 'end': + try: + data = binascii.a2b_uu(s) + except binascii.Error, v: + # Workaround for broken uuencoders by /Fredrik Lundh + nbytes = (((ord(s[0])-32) & 63) * 4 + 5) // 3 + data = binascii.a2b_uu(s[:nbytes]) + if not quiet: + sys.stderr.write("Warning: %s\n" % v) + out_file.write(data) + s = in_file.readline() + if not s: + raise Error('Truncated input file') + finally: + for f in opened_files: + f.close() def test(): """uuencode/uudecode main program""" |