From e305425b86a5896cd3afce0859f4762b1fe62917 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sun, 31 Oct 2010 13:07:00 +0000 Subject: [PATCH] Merged revisions 85975 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r85975 | antoine.pitrou | 2010-10-30 15:03:56 +0200 (sam., 30 oct. 2010) | 4 lines Issue #10246: uu.encode didn't close file objects explicitly when filenames were given to it. Patch by Brian Brazil. ........ --- Lib/uu.py | 69 ++++++++++++++++++++++++++++++------------------------- Misc/NEWS | 3 +++ 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/Lib/uu.py b/Lib/uu.py index d70f0e60be..829f2925fd 100755 --- a/Lib/uu.py +++ b/Lib/uu.py @@ -44,40 +44,47 @@ def encode(in_file, out_file, name=None, mode=None): # # If in_file is a pathname open it and change defaults # - if in_file == '-': - in_file = sys.stdin.buffer - elif isinstance(in_file, str): + opened_files = [] + try: + if in_file == '-': + in_file = sys.stdin.buffer + elif isinstance(in_file, str): + if name is None: + name = os.path.basename(in_file) + if mode is None: + try: + mode = os.stat(in_file).st_mode + except AttributeError: + pass + in_file = open(in_file, 'rb') + opened_files.append(in_file) + # + # Open out_file if it is a pathname + # + if out_file == '-': + out_file = sys.stdout.buffer + elif isinstance(out_file, str): + out_file = open(out_file, 'wb') + opened_files.append(out_file) + # + # Set defaults for name and mode + # if name is None: - name = os.path.basename(in_file) + name = '-' if mode is None: - try: - mode = os.stat(in_file).st_mode - except AttributeError: - pass - in_file = open(in_file, 'rb') - # - # Open out_file if it is a pathname - # - if out_file == '-': - out_file = sys.stdout.buffer - elif isinstance(out_file, str): - out_file = open(out_file, 'wb') - # - # Set defaults for name and mode - # - if name is None: - name = '-' - if mode is None: - mode = 0o666 - # - # Write the data - # - out_file.write(('begin %o %s\n' % ((mode & 0o777), name)).encode("ascii")) - data = in_file.read(45) - while len(data) > 0: - out_file.write(binascii.b2a_uu(data)) + mode = 0o666 + # + # Write the data + # + out_file.write(('begin %o %s\n' % ((mode & 0o777), name)).encode("ascii")) data = in_file.read(45) - out_file.write(b' \nend\n') + while len(data) > 0: + out_file.write(binascii.b2a_uu(data)) + data = in_file.read(45) + out_file.write(b' \nend\n') + finally: + for f in opened_files: + f.close() def decode(in_file, out_file=None, mode=None, quiet=False): diff --git a/Misc/NEWS b/Misc/NEWS index ce29e40d1c..b763dab6c4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -143,6 +143,9 @@ C-API Library ------- +- Issue #10246: uu.encode didn't close file objects explicitly when filenames + were given to it. Patch by Brian Brazil. + - Issue #10253: FileIO leaks a file descriptor when trying to open a file for append that isn't seekable. Patch by Brian Brazil. -- 2.40.0