blob: 0deeb9e08ccc6a98d750fe82088628626c2fb392 [file] [log] [blame]
Jean-Paul Calderonefd593122013-03-03 10:21:53 -08001import sys
2sys.modules['ssl'] = None
3sys.modules['_hashlib'] = None
4
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -08005
6import traceback
7
8from cffi import api as _api
9_ffi = _api.FFI()
10_ffi.cdef(
11 """
12 void *malloc(size_t size);
13 void free(void *ptr);
14 void *realloc(void *ptr, size_t size);
15
16 int CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *));
17
18 int backtrace(void **buffer, int size);
19 char **backtrace_symbols(void *const *buffer, int size);
20 void backtrace_symbols_fd(void *const *buffer, int size, int fd);
Hynek Schlawack7b3aa902015-10-16 21:06:20 +020021 """) # noqa
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080022_api = _ffi.verify(
23 """
24 #include <openssl/crypto.h>
25 #include <stdlib.h>
26 #include <execinfo.h>
27 """, libraries=["crypto"])
28C = _ffi.dlopen(None)
29
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080030verbose = False
31
Hynek Schlawack7b3aa902015-10-16 21:06:20 +020032
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080033def log(s):
34 if verbose:
Jean-Paul Calderone558b78a2014-01-10 14:08:50 -050035 print(s)
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080036
Hynek Schlawack7b3aa902015-10-16 21:06:20 +020037
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080038def _backtrace():
39 buf = _ffi.new("void*[]", 64)
40 result = _api.backtrace(buf, len(buf))
41 strings = _api.backtrace_symbols(buf, result)
42 stack = [_ffi.string(strings[i]) for i in range(result)]
43 C.free(strings)
44 return stack
45
46
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080047@_ffi.callback("void*(*)(size_t)")
Jean-Paul Calderoneede8b712014-01-01 12:36:46 -050048def malloc(n):
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080049 memory = C.malloc(n)
50 python_stack = traceback.extract_stack(limit=3)
51 c_stack = _backtrace()
Jean-Paul Calderonec2e8b412013-03-02 16:27:55 -080052 heap[memory] = [(n, python_stack, c_stack)]
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080053 log("malloc(%d) -> %s" % (n, memory))
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080054 return memory
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080055
56
57@_ffi.callback("void*(*)(void*, size_t)")
Jean-Paul Calderoneede8b712014-01-01 12:36:46 -050058def realloc(p, n):
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080059 memory = C.realloc(p, n)
60 old = heap.pop(p)
61
62 python_stack = traceback.extract_stack(limit=3)
63 c_stack = _backtrace()
64
Jean-Paul Calderonec2e8b412013-03-02 16:27:55 -080065 old.append((n, python_stack, c_stack))
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080066 heap[memory] = old
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080067 log("realloc(0x%x, %d) -> %s" % (int(_ffi.cast("int", p)), n, memory))
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080068 return memory
69
70
71@_ffi.callback("void(*)(void*)")
Jean-Paul Calderoneede8b712014-01-01 12:36:46 -050072def free(p):
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080073 if p != _ffi.NULL:
74 C.free(p)
75 del heap[p]
Jean-Paul Calderonefd593122013-03-03 10:21:53 -080076 log("free(0x%x)" % (int(_ffi.cast("int", p)),))
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080077
78
Jean-Paul Calderoneede8b712014-01-01 12:36:46 -050079if _api.CRYPTO_set_mem_functions(malloc, realloc, free):
Jean-Paul Calderone558b78a2014-01-10 14:08:50 -050080 log('Enabled memory debugging')
Jean-Paul Calderone8e4a6632013-03-03 17:30:27 -080081 heap = {}
Jean-Paul Calderone68a6f8f2013-03-01 17:56:22 -080082else:
Jean-Paul Calderone558b78a2014-01-10 14:08:50 -050083 log('Failed to enable memory debugging')
Jean-Paul Calderone8e4a6632013-03-03 17:30:27 -080084 heap = None