[Python-checkins] r86039 - in python/branches/release27-maint: Lib/test/test_uu.py Lib/uu.py Misc/NEWS

antoine.pitrou python-checkins at python.org
Sun Oct 31 17:17:36 CET 2010


Author: antoine.pitrou
Date: Sun Oct 31 17:17:36 2010
New Revision: 86039

Log:
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.
........


Modified:
   python/branches/release27-maint/   (props changed)
   python/branches/release27-maint/Lib/test/test_uu.py
   python/branches/release27-maint/Lib/uu.py
   python/branches/release27-maint/Misc/NEWS

Modified: python/branches/release27-maint/Lib/test/test_uu.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_uu.py	(original)
+++ python/branches/release27-maint/Lib/test/test_uu.py	Sun Oct 31 17:17:36 2010
@@ -161,6 +161,23 @@
         finally:
             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):
         # Verify that decode() will refuse to overwrite an existing file
         f = None

Modified: python/branches/release27-maint/Lib/uu.py
==============================================================================
--- python/branches/release27-maint/Lib/uu.py	(original)
+++ python/branches/release27-maint/Lib/uu.py	Sun Oct 31 17:17:36 2010
@@ -92,65 +92,68 @@
     #
     # Open the input file, if needed.
     #
+    opened_files = []
     if in_file == '-':
         in_file = sys.stdin
     elif isinstance(in_file, basestring):
         in_file = open(in_file)
-    #
-    # 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('begin'):
-            continue
-        hdrfields = hdr.split(' ', 2)
-        if len(hdrfields) == 3 and hdrfields[0] == '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('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:
-                int(hdrfields[1], 8)
-                break
-            except ValueError:
+                os.path.chmod(out_file, mode)
+            except AttributeError:
                 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
-    #
-    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)
+            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() != '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()
+        if not s:
+            raise Error('Truncated input file')
+    finally:
+        for f in opened_files:
+            f.close()
 
 def test():
     """uuencode/uudecode main program"""

Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS	(original)
+++ python/branches/release27-maint/Misc/NEWS	Sun Oct 31 17:17:36 2010
@@ -66,6 +66,9 @@
 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
   were given to it.  Patch by Brian Brazil.
 


More information about the Python-checkins mailing list