0.4.27-51-g8e7d98e.move-lock-to-global-scope.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. Subject: Move lock to global scope
  2. Origin: upstream, commit 0.4.27-51-g8e7d98e <https://github.com/ahupp/python-magic/commit/0.4.27-51-g8e7d98e>
  3. Author: ddelange <14880945+ddelange@users.noreply.github.com>
  4. Date: Tue Oct 14 14:23:53 2025 +0300
  5. --- a/magic/__init__.py
  6. +++ b/magic/__init__.py
  7. @@ -105,7 +105,6 @@
  8. self.flags |= MAGIC_NO_CHECK_SIMH
  9. self.cookie = magic_open(self.flags)
  10. - self.lock = threading.Lock()
  11. magic_load(self.cookie, magic_file)
  12. @@ -134,34 +133,31 @@
  13. """
  14. Identify the contents of `buf`
  15. """
  16. - with self.lock:
  17. - try:
  18. - # if we're on python3, convert buf to bytes
  19. - # otherwise this string is passed as wchar*
  20. - # which is not what libmagic expects
  21. - # NEXTBREAK: only take bytes
  22. - if type(buf) == str and str != bytes:
  23. - buf = buf.encode("utf-8", errors="replace")
  24. - return maybe_decode(magic_buffer(self.cookie, buf))
  25. - except MagicException as e:
  26. - return self._handle509Bug(e)
  27. + try:
  28. + # if we're on python3, convert buf to bytes
  29. + # otherwise this string is passed as wchar*
  30. + # which is not what libmagic expects
  31. + # NEXTBREAK: only take bytes
  32. + if type(buf) == str and str != bytes:
  33. + buf = buf.encode("utf-8", errors="replace")
  34. + return maybe_decode(magic_buffer(self.cookie, buf))
  35. + except MagicException as e:
  36. + return self._handle509Bug(e)
  37. def from_file(self, filename):
  38. # raise FileNotFoundException or IOError if the file does not exist
  39. os.stat(filename, follow_symlinks=self.flags & MAGIC_SYMLINK)
  40. - with self.lock:
  41. - try:
  42. - return maybe_decode(magic_file(self.cookie, filename))
  43. - except MagicException as e:
  44. - return self._handle509Bug(e)
  45. + try:
  46. + return maybe_decode(magic_file(self.cookie, filename))
  47. + except MagicException as e:
  48. + return self._handle509Bug(e)
  49. def from_descriptor(self, fd):
  50. - with self.lock:
  51. - try:
  52. - return maybe_decode(magic_descriptor(self.cookie, fd))
  53. - except MagicException as e:
  54. - return self._handle509Bug(e)
  55. + try:
  56. + return maybe_decode(magic_descriptor(self.cookie, fd))
  57. + except MagicException as e:
  58. + return self._handle509Bug(e)
  59. def _handle509Bug(self, e):
  60. # libmagic 5.09 has a bug where it might fail to identify the
  61. @@ -313,6 +309,9 @@
  62. return filename
  63. +# libmagic is not thread-safe: guard for concurrent calls on a global scope
  64. +LOCK = threading.Lock()
  65. +
  66. magic_open = libmagic.magic_open
  67. magic_open.restype = magic_t
  68. magic_open.argtypes = [c_int]
  69. @@ -336,7 +335,8 @@
  70. def magic_file(cookie, filename):
  71. - return _magic_file(cookie, coerce_filename(filename))
  72. + with LOCK:
  73. + return _magic_file(cookie, coerce_filename(filename))
  74. _magic_buffer = libmagic.magic_buffer
  75. @@ -346,7 +346,8 @@
  76. def magic_buffer(cookie, buf):
  77. - return _magic_buffer(cookie, buf, len(buf))
  78. + with LOCK:
  79. + return _magic_buffer(cookie, buf, len(buf))
  80. magic_descriptor = libmagic.magic_descriptor
  81. @@ -361,7 +362,8 @@
  82. def magic_descriptor(cookie, fd):
  83. - return _magic_descriptor(cookie, fd)
  84. + with LOCK:
  85. + return _magic_descriptor(cookie, fd)
  86. _magic_load = libmagic.magic_load
  87. @@ -371,7 +373,8 @@
  88. def magic_load(cookie, filename):
  89. - return _magic_load(cookie, coerce_filename(filename))
  90. + with LOCK:
  91. + return _magic_load(cookie, coerce_filename(filename))
  92. magic_setflags = libmagic.magic_setflags
  93. @@ -404,15 +407,16 @@
  94. if not _has_param:
  95. raise NotImplementedError("magic_setparam not implemented")
  96. v = c_size_t(val)
  97. - return _magic_setparam(cookie, param, byref(v))
  98. + with LOCK:
  99. + return _magic_setparam(cookie, param, byref(v))
  100. def magic_getparam(cookie, param):
  101. if not _has_param:
  102. raise NotImplementedError("magic_getparam not implemented")
  103. val = c_size_t()
  104. - _magic_getparam(cookie, param, byref(val))
  105. - return val.value
  106. + with LOCK:
  107. + return _magic_getparam(cookie, param, byref(val)).value
  108. _has_version = False
  109. @@ -423,10 +427,11 @@
  110. magic_version.argtypes = []
  111. -def version():
  112. +def version(lock=None):
  113. if not _has_version:
  114. raise NotImplementedError("magic_version not implemented")
  115. - return magic_version()
  116. + with LOCK:
  117. + return magic_version()
  118. MAGIC_NONE = 0x000000 # No flags