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.
........
This commit is contained in:
Antoine Pitrou 2010-10-31 16:17:36 +00:00
parent 9f3f9c5125
commit 61d14b7659
3 changed files with 75 additions and 52 deletions

View file

@ -161,6 +161,23 @@ class UUFileTest(unittest.TestCase):
finally: finally:
self._kill(f) 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): def test_decodetwice(self):
# Verify that decode() will refuse to overwrite an existing file # Verify that decode() will refuse to overwrite an existing file
f = None f = None

107
Lib/uu.py
View file

@ -92,65 +92,68 @@ def decode(in_file, out_file=None, mode=None, quiet=0):
# #
# Open the input file, if needed. # Open the input file, if needed.
# #
opened_files = []
if in_file == '-': if in_file == '-':
in_file = sys.stdin in_file = sys.stdin
elif isinstance(in_file, basestring): elif isinstance(in_file, basestring):
in_file = open(in_file) in_file = open(in_file)
# opened_files.append(in_file)
# Read until a begin is encountered or we've exhausted the file try:
# #
while True: # Read until a begin is encountered or we've exhausted the file
hdr = in_file.readline() #
if not hdr: while True:
raise Error('No valid begin line found in input file') hdr = in_file.readline()
if not hdr.startswith('begin'): if not hdr:
continue raise Error('No valid begin line found in input file')
hdrfields = hdr.split(' ', 2) if not hdr.startswith('begin'):
if len(hdrfields) == 3 and hdrfields[0] == '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: try:
int(hdrfields[1], 8) os.path.chmod(out_file, mode)
break except AttributeError:
except ValueError:
pass pass
if out_file is None: out_file = fp
out_file = hdrfields[2].rstrip() opened_files.append(out_file)
if os.path.exists(out_file): #
raise Error('Cannot overwrite existing file: %s' % out_file) # Main decoding loop
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)
s = in_file.readline() s = in_file.readline()
if not s: while s and s.strip() != 'end':
raise Error('Truncated input file') try:
if opened: data = binascii.a2b_uu(s)
out_file.close() 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(): def test():
"""uuencode/uudecode main program""" """uuencode/uudecode main program"""

View file

@ -66,6 +66,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10266: uu.decode didn't close in_file explicitly when it was given
as a filename. Patch by Brian Brazil.
- Issue #10246: uu.encode didn't close file objects explicitly when filenames - Issue #10246: uu.encode didn't close file objects explicitly when filenames
were given to it. Patch by Brian Brazil. were given to it. Patch by Brian Brazil.