@@ -105,6 +105,7 @@ def __init__(
105105 self .flags |= MAGIC_NO_CHECK_SIMH
106106
107107 self .cookie = magic_open (self .flags )
108+ self .lock = threading .Lock ()
108109
109110 magic_load (self .cookie , magic_file )
110111
@@ -133,31 +134,34 @@ def from_buffer(self, buf):
133134 """
134135 Identify the contents of `buf`
135136 """
136- try :
137- # if we're on python3, convert buf to bytes
138- # otherwise this string is passed as wchar*
139- # which is not what libmagic expects
140- # NEXTBREAK: only take bytes
141- if type (buf ) == str and str != bytes :
142- buf = buf .encode ("utf-8" , errors = "replace" )
143- return maybe_decode (magic_buffer (self .cookie , buf ))
144- except MagicException as e :
145- return self ._handle509Bug (e )
137+ with self .lock :
138+ try :
139+ # if we're on python3, convert buf to bytes
140+ # otherwise this string is passed as wchar*
141+ # which is not what libmagic expects
142+ # NEXTBREAK: only take bytes
143+ if type (buf ) == str and str != bytes :
144+ buf = buf .encode ("utf-8" , errors = "replace" )
145+ return maybe_decode (magic_buffer (self .cookie , buf ))
146+ except MagicException as e :
147+ return self ._handle509Bug (e )
146148
147149 def from_file (self , filename ):
148150 # raise FileNotFoundException or IOError if the file does not exist
149151 os .stat (filename , follow_symlinks = self .flags & MAGIC_SYMLINK )
150152
151- try :
152- return maybe_decode (magic_file (self .cookie , filename ))
153- except MagicException as e :
154- return self ._handle509Bug (e )
153+ with self .lock :
154+ try :
155+ return maybe_decode (magic_file (self .cookie , filename ))
156+ except MagicException as e :
157+ return self ._handle509Bug (e )
155158
156159 def from_descriptor (self , fd ):
157- try :
158- return maybe_decode (magic_descriptor (self .cookie , fd ))
159- except MagicException as e :
160- return self ._handle509Bug (e )
160+ with self .lock :
161+ try :
162+ return maybe_decode (magic_descriptor (self .cookie , fd ))
163+ except MagicException as e :
164+ return self ._handle509Bug (e )
161165
162166 def _handle509Bug (self , e ):
163167 # libmagic 5.09 has a bug where it might fail to identify the
@@ -309,9 +313,6 @@ def coerce_filename(filename):
309313 return filename
310314
311315
312- # libmagic is not thread-safe: guard for concurrent calls on a global scope
313- LOCK = threading .Lock ()
314-
315316magic_open = libmagic .magic_open
316317magic_open .restype = magic_t
317318magic_open .argtypes = [c_int ]
@@ -335,8 +336,7 @@ def coerce_filename(filename):
335336
336337
337338def magic_file (cookie , filename ):
338- with LOCK :
339- return _magic_file (cookie , coerce_filename (filename ))
339+ return _magic_file (cookie , coerce_filename (filename ))
340340
341341
342342_magic_buffer = libmagic .magic_buffer
@@ -346,8 +346,7 @@ def magic_file(cookie, filename):
346346
347347
348348def magic_buffer (cookie , buf ):
349- with LOCK :
350- return _magic_buffer (cookie , buf , len (buf ))
349+ return _magic_buffer (cookie , buf , len (buf ))
351350
352351
353352magic_descriptor = libmagic .magic_descriptor
@@ -362,8 +361,7 @@ def magic_buffer(cookie, buf):
362361
363362
364363def magic_descriptor (cookie , fd ):
365- with LOCK :
366- return _magic_descriptor (cookie , fd )
364+ return _magic_descriptor (cookie , fd )
367365
368366
369367_magic_load = libmagic .magic_load
@@ -373,8 +371,7 @@ def magic_descriptor(cookie, fd):
373371
374372
375373def magic_load (cookie , filename ):
376- with LOCK :
377- return _magic_load (cookie , coerce_filename (filename ))
374+ return _magic_load (cookie , coerce_filename (filename ))
378375
379376
380377magic_setflags = libmagic .magic_setflags
@@ -407,16 +404,14 @@ def magic_setparam(cookie, param, val):
407404 if not _has_param :
408405 raise NotImplementedError ("magic_setparam not implemented" )
409406 v = c_size_t (val )
410- with LOCK :
411- return _magic_setparam (cookie , param , byref (v ))
407+ return _magic_setparam (cookie , param , byref (v ))
412408
413409
414410def magic_getparam (cookie , param ):
415411 if not _has_param :
416412 raise NotImplementedError ("magic_getparam not implemented" )
417413 val = c_size_t ()
418- with LOCK :
419- _magic_getparam (cookie , param , byref (val ))
414+ _magic_getparam (cookie , param , byref (val ))
420415 return val .value
421416
422417
@@ -431,8 +426,7 @@ def magic_getparam(cookie, param):
431426def version ():
432427 if not _has_version :
433428 raise NotImplementedError ("magic_version not implemented" )
434- with LOCK :
435- return magic_version ()
429+ return magic_version ()
436430
437431
438432MAGIC_NONE = 0x000000 # No flags
0 commit comments