[Python-checkins] cpython (2.7): Issue #20331: Fixed possible FD leaks in various modules:

serhiy.storchaka python-checkins at python.org
Sat Jan 25 18:44:09 CET 2014


http://hg.python.org/cpython/rev/6548f894b590
changeset: 88701:6548f894b590
branch: 2.7
parent: 88682:02f6c31c36a5
user: Serhiy Storchaka <storchaka at gmail.com>
date: Sat Jan 25 19:42:27 2014 +0200
summary:
 Issue #20331: Fixed possible FD leaks in various modules:
SimpleHTTPServer, imghdr, mailcap, mimetypes, xml.etree.
files:
 Lib/SimpleHTTPServer.py | 24 +++++++++++++-------
 Lib/imghdr.py | 20 +++++++---------
 Lib/mailcap.py | 4 +-
 Lib/mimetypes.py | 7 +++--
 Lib/xml/etree/ElementInclude.py | 15 ++++++-------
 5 files changed, 37 insertions(+), 33 deletions(-)
diff --git a/Lib/SimpleHTTPServer.py b/Lib/SimpleHTTPServer.py
--- a/Lib/SimpleHTTPServer.py
+++ b/Lib/SimpleHTTPServer.py
@@ -43,8 +43,10 @@
 """Serve a GET request."""
 f = self.send_head()
 if f:
- self.copyfile(f, self.wfile)
- f.close()
+ try:
+ self.copyfile(f, self.wfile)
+ finally:
+ f.close()
 
 def do_HEAD(self):
 """Serve a HEAD request."""
@@ -88,13 +90,17 @@
 except IOError:
 self.send_error(404, "File not found")
 return None
- self.send_response(200)
- self.send_header("Content-type", ctype)
- fs = os.fstat(f.fileno())
- self.send_header("Content-Length", str(fs[6]))
- self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
- self.end_headers()
- return f
+ try:
+ self.send_response(200)
+ self.send_header("Content-type", ctype)
+ fs = os.fstat(f.fileno())
+ self.send_header("Content-Length", str(fs[6]))
+ self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
+ self.end_headers()
+ return f
+ except:
+ f.close()
+ raise
 
 def list_directory(self, path):
 """Helper to produce a directory listing (absent index.html).
diff --git a/Lib/imghdr.py b/Lib/imghdr.py
--- a/Lib/imghdr.py
+++ b/Lib/imghdr.py
@@ -7,18 +7,16 @@
 #-------------------------#
 
 def what(file, h=None):
- if h is None:
- if isinstance(file, basestring):
- f = open(file, 'rb')
- h = f.read(32)
- else:
- location = file.tell()
- h = file.read(32)
- file.seek(location)
- f = None
- else:
- f = None
+ f = None
 try:
+ if h is None:
+ if isinstance(file, basestring):
+ f = open(file, 'rb')
+ h = f.read(32)
+ else:
+ location = file.tell()
+ h = file.read(32)
+ file.seek(location)
 for tf in tests:
 res = tf(h, f)
 if res:
diff --git a/Lib/mailcap.py b/Lib/mailcap.py
--- a/Lib/mailcap.py
+++ b/Lib/mailcap.py
@@ -22,8 +22,8 @@
 fp = open(mailcap, 'r')
 except IOError:
 continue
- morecaps = readmailcapfile(fp)
- fp.close()
+ with fp:
+ morecaps = readmailcapfile(fp)
 for key, value in morecaps.iteritems():
 if not key in caps:
 caps[key] = value
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -373,9 +373,10 @@
 f = open(file)
 except IOError:
 return None
- db = MimeTypes()
- db.readfp(f, True)
- return db.types_map[True]
+ with f:
+ db = MimeTypes()
+ db.readfp(f, True)
+ return db.types_map[True]
 
 
 def _default_mime_types():
diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py
--- a/Lib/xml/etree/ElementInclude.py
+++ b/Lib/xml/etree/ElementInclude.py
@@ -75,14 +75,13 @@
 # @throws IOError If the loader fails to load the resource.
 
 def default_loader(href, parse, encoding=None):
- file = open(href)
- if parse == "xml":
- data = ElementTree.parse(file).getroot()
- else:
- data = file.read()
- if encoding:
- data = data.decode(encoding)
- file.close()
+ with open(href) as file:
+ if parse == "xml":
+ data = ElementTree.parse(file).getroot()
+ else:
+ data = file.read()
+ if encoding:
+ data = data.decode(encoding)
 return data
 
 ##
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /