mirror of
https://github.com/python/cpython.git
synced 2025-08-22 01:35:16 +00:00
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:
parent
9f3f9c5125
commit
61d14b7659
3 changed files with 75 additions and 52 deletions
|
@ -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
107
Lib/uu.py
|
@ -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"""
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue