summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-10-30 13:03:56 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-10-30 13:03:56 (GMT)
commitbfa3470b85960c35b916ddb14189a5867a344103 (patch)
tree0ca751f02e6cffd55e7278c16b9d83d16726c6bb
parentb046b807fac8c2ad0c52a4d9872f8b9ccfd58c5b (diff)
downloadcpython-bfa3470b85960c35b916ddb14189a5867a344103.zip
cpython-bfa3470b85960c35b916ddb14189a5867a344103.tar.gz
cpython-bfa3470b85960c35b916ddb14189a5867a344103.tar.bz2
Issue #10246: uu.encode didn't close file objects explicitly when filenames
were given to it. Patch by Brian Brazil.
-rwxr-xr-xLib/uu.py69
-rw-r--r--Misc/NEWS3
2 files changed, 41 insertions, 31 deletions
diff --git a/Lib/uu.py b/Lib/uu.py
index c917cdd..8054337 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 561dda9..afbf04c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -57,6 +57,9 @@ Core and Builtins
Library
-------
+- Issue #10246: uu.encode didn't close file objects explicitly when filenames
+ were given to it. Patch by Brian Brazil.
+
- Issue #10198: fix duplicate header written to wave files when writeframes()
is called without data.