summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-10-31 16:04:14 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-10-31 16:04:14 (GMT)
commitf569826f06a035b749164f9530efc25fec10691d (patch)
tree35e32ceb500515c64c7c3181e65e7001bbe01c52 /Lib
parente974571d36009e327a97bb83389cf05c2b858288 (diff)
downloadcpython-f569826f06a035b749164f9530efc25fec10691d.zip
cpython-f569826f06a035b749164f9530efc25fec10691d.tar.gz
cpython-f569826f06a035b749164f9530efc25fec10691d.tar.bz2
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.py110
2 files changed, 74 insertions, 53 deletions
diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py
index a54f2c1..d6875c5 100644
--- a/Lib/test/test_uu.py
+++ b/Lib/test/test_uu.py
@@ -196,6 +196,23 @@ class UUFileTest(unittest.TestCase):
finally:
self._kill(f)
+ def test_decode_filename(self):
+ f = None
+ try:
+ support.unlink(self.tmpin)
+ f = open(self.tmpin, 'wb')
+ f.write(encodedtextwrapped(0o644, self.tmpout))
+ f.close()
+
+ uu.decode(self.tmpin)
+
+ f = open(self.tmpout, 'rb')
+ 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 8054337..d68d293 100755
--- a/Lib/uu.py
+++ b/Lib/uu.py
@@ -92,66 +92,70 @@ def decode(in_file, out_file=None, mode=None, quiet=False):
#
# Open the input file, if needed.
#
+ opened_files = []
if in_file == '-':
in_file = sys.stdin.buffer
elif isinstance(in_file, str):
in_file = open(in_file, 'rb')
- #
- # 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(b'begin'):
- continue
- hdrfields = hdr.split(b' ', 2)
- if len(hdrfields) == 3 and hdrfields[0] == b'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(b'begin'):
+ continue
+ hdrfields = hdr.split(b' ', 2)
+ if len(hdrfields) == 3 and hdrfields[0] == b'begin':
+ try:
+ int(hdrfields[1], 8)
+ break
+ except ValueError:
+ pass
+ if out_file is None:
+ # If the filename isn't ASCII, what's up with that?!?
+ out_file = hdrfields[2].rstrip(b' \t\r\n\f').decode("ascii")
+ 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.buffer
+ elif isinstance(out_file, str):
+ 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:
- # If the filename isn't ASCII, what's up with that?!?
- out_file = hdrfields[2].rstrip(b' \t\r\n\f').decode("ascii")
- 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.buffer
- elif isinstance(out_file, str):
- 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(b' \t\r\n\f') != b'end':
- try:
- data = binascii.a2b_uu(s)
- except binascii.Error as v:
- # Workaround for broken uuencoders by /Fredrik Lundh
- nbytes = (((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(b' \t\r\n\f') != b'end':
+ try:
+ data = binascii.a2b_uu(s)
+ except binascii.Error as v:
+ # Workaround for broken uuencoders by /Fredrik Lundh
+ nbytes = (((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"""