From f2651e193c43a0cadc3ef4d94cfbe74a1be862bb Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Mon, 27 Apr 2009 20:50:20 +0000 Subject: [PATCH] Issue #5853: calling a function of the mimetypes module from several threads at once could hit the recursion limit if the mimetypes database hadn't been initialized before. --- Lib/mimetypes.py | 28 +++++++++++++--------------- Misc/NEWS | 4 ++++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 6212e784194..f0a5ecf7bba 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -44,6 +44,7 @@ knownfiles = [ ] inited = False +_db = None class MimeTypes: @@ -237,9 +238,9 @@ def guess_type(url, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_type(url, strict) + return _db.guess_type(url, strict) def guess_all_extensions(type, strict=True): @@ -255,9 +256,9 @@ def guess_all_extensions(type, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_all_extensions(type, strict) + return _db.guess_all_extensions(type, strict) def guess_extension(type, strict=True): """Guess the extension for a file based on its MIME type. @@ -271,9 +272,9 @@ def guess_extension(type, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_extension(type, strict) + return _db.guess_extension(type, strict) def add_type(type, ext, strict=True): """Add a mapping between a type and an extension. @@ -287,16 +288,15 @@ def add_type(type, ext, strict=True): list of standard types, else to the list of non-standard types. """ - if not inited: + if _db is None: init() - return add_type(type, ext, strict) + return _db.add_type(type, ext, strict) def init(files=None): - global guess_all_extensions, guess_extension, guess_type global suffix_map, types_map, encodings_map, common_types - global add_type, inited - inited = True + global inited, _db + inited = True # so that MimeTypes.__init__() doesn't call us again db = MimeTypes() if files is None: files = knownfiles @@ -306,11 +306,9 @@ def init(files=None): encodings_map = db.encodings_map suffix_map = db.suffix_map types_map = db.types_map[True] - guess_all_extensions = db.guess_all_extensions - guess_extension = db.guess_extension - guess_type = db.guess_type - add_type = db.add_type common_types = db.types_map[False] + # Make the DB a global variable now that it is fully initialized + _db = db def read_mime_types(file): diff --git a/Misc/NEWS b/Misc/NEWS index 082612effce..24ec692eafe 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -255,6 +255,10 @@ Core and Builtins Library ------- +- Issue #5853: calling a function of the mimetypes module from several threads + at once could hit the recursion limit if the mimetypes database hadn't been + initialized before. + - Issue #5854: Updated __all__ to include some missing names and remove some names which should not be exported.