On Wed, Oct 05, 2016 at 12:31:27PM +0100, Stuart Henderson wrote:
> There's a segfault when py-requests GETs an https resource (segv occurs
> after it calls verify_cb, it happens every time for every site I've tried).
> e.g.
> 
> $ printf "import requests\nr = requests.get('https://www.openbsd.org/')\n" | 
> python2.7
> Segmentation fault (core dumped) 
> 
> Any ideas who is to blame or where to poke at next?
> 

I test on two machines, work fine, no segv.

Snapshot:

kern.version=OpenBSD 6.0-current (GENERIC.MP) #2529: Tue Oct  4 17:53:45 MDT 
2016
    dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP

Python 2.7.12 (default, Sep 26 2016, 15:57:20)
[GCC 4.2.1 20070719 ] on openbsd6


> $ python2.7
> Python 2.7.12 (default, Oct  3 2016, 09:11:44) 
> [GCC 4.2.1 20070719 ] on openbsd6
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import requests
> >>> r = requests.get('https://dmtx.uk/')
> Segmentation fault (core dumped) 
> 
> $ gdb `which python2.7` python2.7.core     
> GNU gdb 6.3
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for details.
> This GDB was configured as "amd64-unknown-openbsd6.0"...(no debugging symbols 
> found)
> 
> Core was generated by `python2.7'.
> Program terminated with signal 11, Segmentation fault.
> Reading symbols from /usr/lib/libpthread.so.23.0...done.
> Loaded symbols for /usr/lib/libpthread.so.23.0
> Reading symbols from /usr/lib/libpthread.so.22.0...done.
> Loaded symbols for /usr/lib/libpthread.so.22.0
> Loaded symbols for /usr/local/bin/python2.7
> Reading symbols from /usr/local/lib/libpython2.7.so.0.0...done.
> Loaded symbols for /usr/local/lib/libpython2.7.so.0.0
> Symbols already loaded for /usr/lib/libpthread.so.23.0
> Reading symbols from /usr/lib/libutil.so.12.1...done.
> Loaded symbols for /usr/lib/libutil.so.12.1
> Reading symbols from /usr/lib/libstdc++.so.57.0...done.
> Loaded symbols for /usr/lib/libstdc++.so.57.0
> Reading symbols from /usr/lib/libm.so.10.0...done.
> Loaded symbols for /usr/lib/libm.so.10.0
> Reading symbols from /usr/lib/libc.so.89.2...done.
> Loaded symbols for /usr/lib/libc.so.89.2
> Reading symbols from /usr/libexec/ld.so...done.
> Loaded symbols for /usr/libexec/ld.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_locale.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_locale.so
> Reading symbols from /usr/local/lib/libintl.so.6.0...done.
> Loaded symbols for /usr/local/lib/libintl.so.6.0
> Reading symbols from /usr/local/lib/libiconv.so.6.0...done.
> Loaded symbols for /usr/local/lib/libiconv.so.6.0
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/readline.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/readline.so
> Reading symbols from /usr/lib/libreadline.so.4.0...done.
> Loaded symbols for /usr/lib/libreadline.so.4.0
> Reading symbols from /usr/lib/libncursesw.so.14.0...done.
> Loaded symbols for /usr/lib/libncursesw.so.14.0
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/time.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/time.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/cStringIO.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/cStringIO.so
> Reading symbols from 
> /usr/local/lib/python2.7/lib-dynload/_collections.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_collections.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/operator.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/operator.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/itertools.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/itertools.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_heapq.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_heapq.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_socket.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_socket.so
> Reading symbols from 
> /usr/local/lib/python2.7/lib-dynload/_functools.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_functools.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_ssl.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_ssl.so
> Reading symbols from /usr/lib/libssl.so.39.1...done.
> Loaded symbols for /usr/lib/libssl.so.39.1
> Reading symbols from /usr/lib/libcrypto.so.38.1...done.
> Loaded symbols for /usr/lib/libcrypto.so.38.1
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/strop.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/strop.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_struct.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_struct.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/binascii.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/binascii.so
> Reading symbols from /usr/lib/libz.so.5.0...done.
> Loaded symbols for /usr/lib/libz.so.5.0
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/datetime.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/datetime.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/array.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/array.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_io.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_io.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/math.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/math.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_hashlib.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_hashlib.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_random.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_random.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/fcntl.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/fcntl.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/select.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/select.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_ctypes.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_ctypes.so
> Reading symbols from /usr/local/lib/libffi.so.1.2...done.
> Loaded symbols for /usr/local/lib/libffi.so.1.2
> Reading symbols from /usr/local/lib/libuuid.so.14.0...done.
> Loaded symbols for /usr/local/lib/libuuid.so.14.0
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/zlib.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/zlib.so
> Reading symbols from 
> /usr/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/_openssl.so...done.
> Loaded symbols for 
> /usr/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/_openssl.so
> Reading symbols from 
> /usr/local/lib/python2.7/site-packages/_cffi_backend.so...done.
> Loaded symbols for /usr/local/lib/python2.7/site-packages/_cffi_backend.so
> Symbols already loaded for /usr/lib/libpthread.so.22.0
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_json.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_json.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/_bisect.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/_bisect.so
> Reading symbols from /usr/local/lib/python2.7/lib-dynload/cPickle.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/cPickle.so
> Reading symbols from 
> /usr/local/lib/python2.7/lib-dynload/unicodedata.so...done.
> Loaded symbols for /usr/local/lib/python2.7/lib-dynload/unicodedata.so
> #0  0x000015a8f5d58fc0 in ?? ()
> (gdb) bt
> #0  0x000015a8f5d58fc0 in ?? ()
> #1  0x000015a944d9c19c in internal_verify (ctx=0x7f7fffff2d00) at 
> /usr/src/lib/libcrypto/x509/x509_vfy.c:1611
> #2  0x000015a944d9d859 in X509_verify_cert (ctx=0x7f7fffff2d00) at 
> /usr/src/lib/libcrypto/x509/x509_vfy.c:374
> #3  0x000015a8d527b690 in ssl_verify_cert_chain (s=0x15a95bd59000, 
> sk=Variable "sk" is not available.
> ) at /usr/src/lib/libssl/ssl_cert.c:448
> #4  0x000015a8d528edd0 in ssl3_get_server_certificate (s=0x15a95bd59000) at 
> /usr/src/lib/libssl/s3_clnt.c:1015
> #5  0x000015a8d52901c1 in ssl3_connect (s=0x15a95bd59000) at 
> /usr/src/lib/libssl/s3_clnt.c:297
> #6  0x000015a8d527f7de in ssl23_connect (s=0x15a95bd59000) at 
> /usr/src/lib/libssl/s23_clnt.c:477
> #7  0x000015a87fd79e5c in _cffi_f_SSL_do_handshake () from 
> /usr/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/_openssl.so
> #8  0x000015a8a0904868 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #9  0x000015a8a090462a in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #10 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #11 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #12 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #13 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #14 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #15 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #16 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #17 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #18 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #19 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #20 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #21 0x000015a8a088df37 in function_call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #22 0x000015a8a0864008 in PyObject_Call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #23 0x000015a8a0900247 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #24 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #25 0x000015a8a088df37 in function_call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #26 0x000015a8a0864008 in PyObject_Call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #27 0x000015a8a0900247 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #28 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #29 0x000015a8a088df37 in function_call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #30 0x000015a8a0864008 in PyObject_Call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #31 0x000015a8a0900247 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #32 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #33 0x000015a8a088df37 in function_call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #34 0x000015a8a0864008 in PyObject_Call () from 
> /usr/local/lib/libpython2.7.so.0.0
> #35 0x000015a8a0900247 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #36 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #37 0x000015a8a0904567 in PyEval_EvalFrameEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #38 0x000015a8a090667d in PyEval_EvalCodeEx () from 
> /usr/local/lib/libpython2.7.so.0.0
> #39 0x000015a8a0906772 in PyEval_EvalCode () from 
> /usr/local/lib/libpython2.7.so.0.0
> #40 0x000015a8a0923902 in run_mod () from /usr/local/lib/libpython2.7.so.0.0
> #41 0x000015a8a09254eb in PyRun_InteractiveOneFlags () from 
> /usr/local/lib/libpython2.7.so.0.0
> #42 0x000015a8a09256fe in PyRun_InteractiveLoopFlags () from 
> /usr/local/lib/libpython2.7.so.0.0
> #43 0x000015a8a092582c in PyRun_AnyFileExFlags () from 
> /usr/local/lib/libpython2.7.so.0.0
> #44 0x000015a8a093643c in Py_Main () from /usr/local/lib/libpython2.7.so.0.0
> #45 0x000015a675e00462 in _start () from /usr/local/bin/python2.7
> #46 0x0000000000000000 in ?? ()
> (gdb) frame 1
> #1  0x000015a944d9c19c in internal_verify (ctx=0x7f7fffff2d00) at 
> /usr/src/lib/libcrypto/x509/x509_vfy.c:1611
> 1611                  ok = (*cb)(1, ctx);
> (gdb) list
> 1606                          goto end;
> 1607  
> 1608                  /* The last error (if any) is still in the error value 
> */
> 1609                  ctx->current_issuer = xi;
> 1610                  ctx->current_cert = xs;
> 1611                  ok = (*cb)(1, ctx);
> 1612                  if (!ok)
> 1613                          goto end;
> 1614  
> 1615                  n--;
> (gdb) p *ctx
> $1 = {ctx = 0x15a8e3598700, current_method = 0, cert = 0x15a8ba55ff00,
>   untrusted = 0x15a8be37cee0, crls = 0x0, param = 0x15a913dac300,
>   other_ctx = 0x0, verify = 0x15a944d9c090 <internal_verify>,
>   verify_cb = 0x15a8f5d58fc0,
>   get_issuer = 0x15a944dd59b0 <X509_STORE_CTX_get1_issuer>,
>   check_issued = 0x15a944d9b990 <check_issued>,
>   check_revocation = 0x15a944d9cbe0 <check_revocation>,
>   get_crl = 0, check_crl = 0x15a944d9d970 <check_crl>,
>   cert_crl = 0x15a944d9b7c0 <cert_crl>,
>   check_policy = 0x15a944d9b660 <check_policy>,
>   lookup_certs = 0x15a944dd5e30 <X509_STORE_get1_certs>,
>   lookup_crls = 0x15a944dd5c30 <X509_STORE_get1_crls>,
>   cleanup = 0, valid = 0, last_untrusted = 2, chain = 0x15a90e0f90a0,
>   tree = 0x0, explicit_policy = 0, error_depth = 2, error = 0,
>   current_cert = 0x15a94b2ac400, current_issuer = 0x15a94b2ac400,
>   current_crl = 0x0, current_crl_score = 0, current_reasons = 0,
>   parent = 0x0, ex_data = {sk = 0x15a90c5969a0}}
> (gdb) list
> 1606                          goto end;
> 1607  
> 1608                  /* The last error (if any) is still in the error value 
> */
> 1609                  ctx->current_issuer = xi;
> 1610                  ctx->current_cert = xs;
> 1611                  ok = (*cb)(1, ctx);
> 1612                  if (!ok)
> 1613                          goto end;
> 1614  
> 1615                  n--;
> (gdb) p *ctx->cert
> $2 = {cert_info = 0x15a8930ff000, sig_alg = 0x15a887c641a0,
>   signature = 0x15a9078c4880, valid = 0, references = 2,
>   name = 0x15a8b98ffa00 "/CN=dmtx.uk", ex_data = {sk = 0x0},
>   ex_pathlen = -1, ex_pcpathlen = 0, ex_flags = 263,
>   ex_kusage = 160, ex_xkusage = 3, ex_nscert = 0,
>   skid = 0x15a90c596fe0, akid = 0x15a8be37c080,
>   policy_cache = 0x0, crldp = 0x0,
>   altname = 0x15a8e0140a20, nc = 0x0,
>   sha1_hash = "])D\231Dëï·ö\017]óî{Ël!À)X", aux = 0x0}
> (gdb) p *ctx->verify
> $3 = {int (X509_STORE_CTX *)} 0x15a944d9c090 <internal_verify>
> (gdb) p *ctx->verify_cb
> $4 = {int (int, X509_STORE_CTX *)} 0x15a8f5d58fc0
> 

-- 
Alexandr Shadchin

Reply via email to