@@ -109,6 +109,7 @@ def __init__(
109109 self .flags |= MAGIC_NO_CHECK_SIMH
110110
111111 self .cookie = magic_open (self .flags )
112+ self .lock = threading .Lock ()
112113
113114 magic_load (self .cookie , magic_file )
114115
@@ -137,31 +138,34 @@ def from_buffer(self, buf):
137138 """
138139 Identify the contents of `buf`
139140 """
140- try :
141- # if we're on python3, convert buf to bytes
142- # otherwise this string is passed as wchar*
143- # which is not what libmagic expects
144- # NEXTBREAK: only take bytes
145- if type (buf ) == str and str != bytes :
146- buf = buf .encode ("utf-8" , errors = "replace" )
147- return maybe_decode (magic_buffer (self .cookie , buf ))
148- except MagicException as e :
149- return self ._handle509Bug (e )
141+ with self .lock :
142+ try :
143+ # if we're on python3, convert buf to bytes
144+ # otherwise this string is passed as wchar*
145+ # which is not what libmagic expects
146+ # NEXTBREAK: only take bytes
147+ if type (buf ) == str and str != bytes :
148+ buf = buf .encode ("utf-8" , errors = "replace" )
149+ return maybe_decode (magic_buffer (self .cookie , buf ))
150+ except MagicException as e :
151+ return self ._handle509Bug (e )
150152
151153 def from_file (self , filename ):
152154 # raise FileNotFoundException or IOError if the file does not exist
153155 os .stat (filename , follow_symlinks = self .flags & MAGIC_SYMLINK )
154156
155- try :
156- return maybe_decode (magic_file (self .cookie , filename ))
157- except MagicException as e :
158- return self ._handle509Bug (e )
157+ with self .lock :
158+ try :
159+ return maybe_decode (magic_file (self .cookie , filename ))
160+ except MagicException as e :
161+ return self ._handle509Bug (e )
159162
160163 def from_descriptor (self , fd ):
161- try :
162- return maybe_decode (magic_descriptor (self .cookie , fd ))
163- except MagicException as e :
164- return self ._handle509Bug (e )
164+ with self .lock :
165+ try :
166+ return maybe_decode (magic_descriptor (self .cookie , fd ))
167+ except MagicException as e :
168+ return self ._handle509Bug (e )
165169
166170 def _handle509Bug (self , e ):
167171 # libmagic 5.09 has a bug where it might fail to identify the
@@ -313,9 +317,6 @@ def coerce_filename(filename):
313317 return filename
314318
315319
316- # libmagic is not thread-safe: guard for concurrent calls on a global scope
317- LOCK = threading .Lock ()
318-
319320magic_open = libmagic .magic_open
320321magic_open .restype = magic_t
321322magic_open .argtypes = [c_int ]
@@ -339,8 +340,7 @@ def coerce_filename(filename):
339340
340341
341342def magic_file (cookie , filename ):
342- with LOCK :
343- return _magic_file (cookie , coerce_filename (filename ))
343+ return _magic_file (cookie , coerce_filename (filename ))
344344
345345
346346_magic_buffer = libmagic .magic_buffer
@@ -350,8 +350,7 @@ def magic_file(cookie, filename):
350350
351351
352352def magic_buffer (cookie , buf ):
353- with LOCK :
354- return _magic_buffer (cookie , buf , len (buf ))
353+ return _magic_buffer (cookie , buf , len (buf ))
355354
356355
357356magic_descriptor = libmagic .magic_descriptor
@@ -366,8 +365,7 @@ def magic_buffer(cookie, buf):
366365
367366
368367def magic_descriptor (cookie , fd ):
369- with LOCK :
370- return _magic_descriptor (cookie , fd )
368+ return _magic_descriptor (cookie , fd )
371369
372370
373371_magic_load = libmagic .magic_load
@@ -377,8 +375,7 @@ def magic_descriptor(cookie, fd):
377375
378376
379377def magic_load (cookie , filename ):
380- with LOCK :
381- return _magic_load (cookie , coerce_filename (filename ))
378+ return _magic_load (cookie , coerce_filename (filename ))
382379
383380
384381magic_setflags = libmagic .magic_setflags
@@ -411,16 +408,14 @@ def magic_setparam(cookie, param, val):
411408 if not _has_param :
412409 raise NotImplementedError ("magic_setparam not implemented" )
413410 v = c_size_t (val )
414- with LOCK :
415- return _magic_setparam (cookie , param , byref (v ))
411+ return _magic_setparam (cookie , param , byref (v ))
416412
417413
418414def magic_getparam (cookie , param ):
419415 if not _has_param :
420416 raise NotImplementedError ("magic_getparam not implemented" )
421417 val = c_size_t ()
422- with LOCK :
423- _magic_getparam (cookie , param , byref (val ))
418+ _magic_getparam (cookie , param , byref (val ))
424419 return val .value
425420
426421
@@ -435,8 +430,7 @@ def magic_getparam(cookie, param):
435430def version ():
436431 if not _has_version :
437432 raise NotImplementedError ("magic_version not implemented" )
438- with LOCK :
439- return magic_version ()
433+ return magic_version ()
440434
441435
442436MAGIC_NONE = 0x000000 # No flags
0 commit comments