summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-10-31 16:17:36 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-10-31 16:17:36 (GMT)
commit61d14b7659ebbe37f4eb77db909c4a34619f558e (patch)
tree547ef09cf60dad0d932c293fbd2b591d3136b9ec /Lib
parent9f3f9c512544be77f72a36c5077ab6d7d2a1a83e (diff)
downloadcpython-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.py17
-rwxr-xr-xLib/uu.py107
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
diff --git a/Lib/uu.py b/Lib/uu.py
index ea58f3d..f8fa4c4 100755
--- a/Lib/uu.py
+++ b/Lib/uu.py
@@ -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"""