Package: python2.7-minimal
Version: 2.7.14-7
Severity: important
tglase@tglase:~ $ python x; echo $?
Segmentation fault (core dumped)
139
tglase@tglase:~ $ python3 x; echo $?
0
Test script, from src:python-cryptography_2.1.4-1, attached.
-- System Information:
Debian Release: buster/sid
APT prefers unreleased
APT policy: (500, 'unreleased'), (500, 'buildd-unstable'), (500, 'unstable')
Architecture: x32 (x86_64)
Foreign Architectures: i386, amd64
Kernel: Linux 4.15.0-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=C, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=C (charmap=UTF-8)
Shell: /bin/sh linked to /bin/lksh
Init: sysvinit (via /sbin/init)
Versions of packages python2.7-minimal depends on:
ii libc6 2.27-2
ii libpython2.7-minimal 2.7.14-7
ii zlib1g 1:1.2.8.dfsg-5
Versions of packages python2.7-minimal recommends:
ii python2.7 2.7.14-7
Versions of packages python2.7-minimal suggests:
ii binfmt-support 2.1.8-2
-- no debconf information
def func():
pass
import sys
def main(argv):
import gc
import json
from cryptography.hazmat.bindings._openssl import ffi, lib
heap = {}
@ffi.callback("void *(size_t, const char *, int)")
def malloc(size, path, line):
ptr = lib.Cryptography_malloc_wrapper(size, path, line)
heap[ptr] = (size, path, line)
return ptr
@ffi.callback("void *(void *, size_t, const char *, int)")
def realloc(ptr, size, path, line):
if ptr != ffi.NULL:
del heap[ptr]
new_ptr = lib.Cryptography_realloc_wrapper(ptr, size, path, line)
heap[new_ptr] = (size, path, line)
return new_ptr
@ffi.callback("void(void *, const char *, int)")
def free(ptr, path, line):
if ptr != ffi.NULL:
del heap[ptr]
lib.Cryptography_free_wrapper(ptr, path, line)
result = lib.Cryptography_CRYPTO_set_mem_functions(malloc, realloc, free)
assert result == 1
# Trigger a bunch of initialization stuff.
import cryptography.hazmat.backends.openssl
start_heap = set(heap)
func(*argv[1:])
gc.collect()
gc.collect()
gc.collect()
# Swap back to the original functions so that if OpenSSL tries to free
# something from its atexit handle it won't be going through a Python
# function, which will be deallocated when this function returns
result = lib.Cryptography_CRYPTO_set_mem_functions(
ffi.addressof(lib, "Cryptography_malloc_wrapper"),
ffi.addressof(lib, "Cryptography_realloc_wrapper"),
ffi.addressof(lib, "Cryptography_free_wrapper"),
)
assert result == 1
remaining = set(heap) - start_heap
if remaining:
sys.stdout.write(json.dumps(dict(
(int(ffi.cast("size_t", ptr)), {
"size": heap[ptr][0],
"path": ffi.string(heap[ptr][1]).decode(),
"line": heap[ptr][2],
})
for ptr in remaining
)))
sys.stdout.flush()
sys.exit(255)
main(sys.argv)