aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/pyOpenSSL/py3/tests/memdbg.py
diff options
context:
space:
mode:
authormaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/python/pyOpenSSL/py3/tests/memdbg.py
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
downloadydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/python/pyOpenSSL/py3/tests/memdbg.py')
-rw-r--r--contrib/python/pyOpenSSL/py3/tests/memdbg.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/contrib/python/pyOpenSSL/py3/tests/memdbg.py b/contrib/python/pyOpenSSL/py3/tests/memdbg.py
new file mode 100644
index 0000000000..590b72d068
--- /dev/null
+++ b/contrib/python/pyOpenSSL/py3/tests/memdbg.py
@@ -0,0 +1,91 @@
+import sys
+
+import traceback
+
+from cffi import api as _api
+
+
+sys.modules["ssl"] = None
+sys.modules["_hashlib"] = None
+
+
+_ffi = _api.FFI()
+_ffi.cdef(
+ """
+ void *malloc(size_t size);
+ void free(void *ptr);
+ void *realloc(void *ptr, size_t size);
+
+ int CRYPTO_set_mem_functions(
+ void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *));
+
+ int backtrace(void **buffer, int size);
+ char **backtrace_symbols(void *const *buffer, int size);
+ void backtrace_symbols_fd(void *const *buffer, int size, int fd);
+ """
+) # noqa
+_api = _ffi.verify(
+ """
+ #include <openssl/crypto.h>
+ #include <stdlib.h>
+ #include <execinfo.h>
+ """,
+ libraries=["crypto"],
+)
+C = _ffi.dlopen(None)
+
+verbose = False
+
+
+def log(s):
+ if verbose:
+ print(s)
+
+
+def _backtrace():
+ buf = _ffi.new("void*[]", 64)
+ result = _api.backtrace(buf, len(buf))
+ strings = _api.backtrace_symbols(buf, result)
+ stack = [_ffi.string(strings[i]) for i in range(result)]
+ C.free(strings)
+ return stack
+
+
+@_ffi.callback("void*(*)(size_t)")
+def malloc(n):
+ memory = C.malloc(n)
+ python_stack = traceback.extract_stack(limit=3)
+ c_stack = _backtrace()
+ heap[memory] = [(n, python_stack, c_stack)]
+ log("malloc(%d) -> %s" % (n, memory))
+ return memory
+
+
+@_ffi.callback("void*(*)(void*, size_t)")
+def realloc(p, n):
+ memory = C.realloc(p, n)
+ old = heap.pop(p)
+
+ python_stack = traceback.extract_stack(limit=3)
+ c_stack = _backtrace()
+
+ old.append((n, python_stack, c_stack))
+ heap[memory] = old
+ log("realloc(0x%x, %d) -> %s" % (int(_ffi.cast("int", p)), n, memory))
+ return memory
+
+
+@_ffi.callback("void(*)(void*)")
+def free(p):
+ if p != _ffi.NULL:
+ C.free(p)
+ del heap[p]
+ log("free(0x%x)" % (int(_ffi.cast("int", p)),))
+
+
+if _api.CRYPTO_set_mem_functions(malloc, realloc, free):
+ log("Enabled memory debugging")
+ heap = {}
+else:
+ log("Failed to enable memory debugging")
+ heap = None