cloudflare / cloudflare/quiche
CRYPTO_refcount_dec_and_test_zero() crash
- Dominant language
- Rust
- Stars
- 11.8k
- Forks
- 1.1k
- Avg merge
- 3d 7h
- Merged PRs (30d)
- 16
Description
Today I built curl from git master using quiche from git master, using boringssl from their git master.
This crash happens every time for me, running on Linux (debian unstable, kernel 6.3.0).
Doing a h1 or h2 request work fine, using the same build (and thus the same boringssl). Changing the URL to `https://example.com ` or `https://cloudflare.com` does the same thing for me.
I cannot rule out that curl is doing something wrong to make this happen, but I don't know what.
~~~
$ gdb --args ./src/curl --http3-only https://curl.se/
GNU gdb (Debian 13.2-1) 13.2
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./src/curl...
(gdb) run
Starting program: /home/dast/src/curl/src/curl --http3-only https://curl.se/
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff63ff6c0 (LWP 2009278)]
[Thread 0x7ffff63ff6c0 (LWP 2009278) exited]
Thread 1 "curl" received signal SIGSEGV, Segmentation fault.
CRYPTO_refcount_dec_and_test_zero (
in_count=in_count@entry=0x7ffff7b74878 )
at /home/dast/src/boringssl/crypto/refcount.c:53
53 if (CRYPTO_atomic_compare_exchange_weak_u32(count, &expected,
(gdb) bt full
#0 CRYPTO_refcount_dec_and_test_zero (
in_count=in_count@entry=0x7ffff7b74878 )
at /home/dast/src/boringssl/crypto/refcount.c:53
new_value = 4155852271
count = 0x7ffff7b74878
expected = 4155852272
#1 0x00007ffff7a4ece6 in X509_free (x509=0x7ffff7b74860 )
at /home/dast/src/boringssl/crypto/x509/x_x509.c:126
No locals.
#2 0x00007ffff7b54521 in bssl::ssl_crypto_x509_session_cache_objects (sess=0x5555556e3e08)
at /home/dast/src/boringssl/ssl/ssl_x509.cc:323
chain = {_M_t = {> = {
_M_t = {> = {> = {> = {
_M_head_impl = {}}, }, > = {
_M_head_impl = 0x0}, }, }}, }}
chain_without_leaf = {
_M_t = {> = {
_M_t = {> = {> = {> = {
_M_head_impl = {}}, }, > = {
_M_head_impl = 0x0}, }, }}, }}
leaf =
#3 0x00007ffff7cc8400 in bssl::tls13_process_certificate (hs=0x555555708678, msg=...,
allow_anonymous=false) at /home/daniel/src/boringssl/ssl/tls13_both.cc:302
ssl = 0x555555707c88
body = {data = 0x5555558030eb "\017", len = 0}
decompressed = {
_M_t = {> = {
_M_t = {> = {> = {> = {
_M_head_impl = {}}, }, > = {
_M_head_impl = 0x0}, }, }}, }}
__PRETTY_FUNCTION__ = "bool bssl::tls13_process_certificate(SSL_HANDSHAKE*, const SSLMessage&, bool)"
context = {data = 0x55555580217d "", len = 0}
certificate_list = {data = 0x5555558030eb "\017", len = 0}
certs = {
_M_t = {> = {_M_t = {> = {> = {> = {
_M_head_impl = {}}, }, > = {
_M_head_impl = 0x0}, }, }}, }}
retain_sha256 = false
pkey = {_M_t = {> = {
_M_t = {> = {> = {> = {
_M_head_impl = {}}, }, > = {_M_head_impl = 0x0}, }, }}, }}
#4 0x00007ffff7ccc7a0 in bssl::do_read_server_certificate (hs=0x555555708678)
at /home/daniel/src/boringssl/ssl/tls13_client.cc:704
ssl = 0x555555707c88
msg = {is_v2_hello = false, type = 11 '\v', body = {data = 0x55555580217c "",
len = 3951}, raw = {data = 0x555555802178 "\v", len = 3955}}
#5 0x00007ffff7ccd36b in bssl::tls13_client_handshake (hs=0x555555708678)
at /home/daniel/src/boringssl/ssl/tls13_client.cc:950
ret = bssl::ssl_hs_error
state = bssl::state_read_server_certificate
#6 0x00007ffff7cec8db in bssl::do_tls13 (hs=0x555555708678)
at /home/daniel/src/boringssl/ssl/handshake_client.cc:900
wait = 21845
#7 0x00007ffff7cefba5 in bssl::ssl_client_handshake (hs=0x555555708678)
at /home/daniel/src/boringssl/ssl/handshake_client.cc:1873
ret = bssl::ssl_hs_error
state = bssl::state_tls13
#8 0x00007ffff7ce99db in bssl::ssl_run_handshake (hs=0x555555708678,
out_early_return=0x7ffffffe8c43) at /home/daniel/src/boringssl/ssl/handshake.cc:738
ssl = 0x555555707c88
__PRETTY_FUNCTION__ = "int bssl::ssl_run_handshake(SSL_HANDSHAKE*, bool*)"
#9 0x00007ffff7cb049d in SSL_do_handshake (ssl=0x555555707c88)
at /home/daniel/src/boringssl/ssl/ssl_lib.cc:851
hs = 0x555555708678
early_return = false
ret = 1
#10 0x00007ffff7c58de6 in quiche::tls::Handshake::do_handshake (self=,
ex_data=0x7ffffffe8e70) at quiche/src/tls.rs:632
No locals.
#11 0x00007ffff7c464db in quiche::Connection::do_handshake (self=0x55555570a110, now=...)
at quiche/src/lib.rs:6410
ex_data = quiche::tls::ExData {application_protos: 0x55555570e3a8, pkt_num_spaces: 0x55555570a290, session: 0x55555570e2f0, local_error: 0x55555570e3f0, keylog: core::option::Option<&mut alloc::boxed::Box<(dyn std::io::Write + core::marker::Send + core::marker::Sync), alloc::alloc::Global>>::None, trace_id: "3c227c28b39d8fd0b2f0dfe34d6cb4d9bfbbb851", is_server: false}
#12 0x00007ffff7c47e63 in quiche::Connection::process_frame (self=0x55555570a110,
frame=..., hdr=, recv_path_id=, epoch=,
now=...) at quiche/src/lib.rs:6758
stream = 0x55555570c9d0
level = quiche::crypto::Level::Handshake
crypto_buf = [88, 109, 153, 254, 87, 232, 54, 14, 240, 14, 35, 170, 253, 136, 151,
208, 227, 92, 14, 148, 73, 181, 181, 23, 53, 210, 46, 191, 78, 133, 239, 24, 224,
133, 146, 235, 6, 59, 108, 41, 35, 9, 96, 220, 69, 2, 76, 18, 24, 59, 233, 251,
14, 222, 220, 68, 248, 88, 152, 174, 234, 189, 69, 69, 161, 136, 93, 102, 202,
254, 16, 233, 111, 130, 200, 17, 66, 13, 251, 233, 236, 227, 134, 0, 222, 157,
16, 227, 56, 250, 164, 125, 177, 216, 232, 73, 130, 132, 6, 155, 43, 232, 107,
79, 1, 12, 56, 119, 46, 249, 221, 231, 57, 0, 0, 15, 0, 1, 4, 8, 4, 1, 0, 114,
48, 43, 174, 143, 47, 120, 30, 131, 165, 113, 224, 79, 68, 3, 12, 184, 124, 2, 5,
13, 117, 38, 10, 67, 81, 56, 66, 45, 88, 188, 121, 237, 248, 164, 203, 225, 240,
237, 78, 200, 102, 43, 68, 90, 36, 208, 144, 52, 5, 241, 47, 60, 101, 94, 44,
218, 81, 217, 90, 25, 124, 45, 239, 168, 107, 229, 106, 209, 168, 223, 242, 130,
195, 238, 196, 112...]
data =
#13 0x00007ffff7c39eaa in quiche::Connection::recv_single (self=0x55555570a110, buf=...,
info=, recv_pid=) at quiche/src/lib.rs:2732
e =
frame = quiche::frame::Frame::ACK{ack_delay: 0, ranges: , ecn_counts: core::option::Option::None}
probing = false
frame_processing_err =
ack_elicited = true
recv_pid = 0
payload = octets::Octets {buf: &[u8] [], off: 140737488277936}
aead_next = core::option::Option<(quiche::crypto::Open, quiche::crypto::Seal)>::Some((quiche::crypto::Open {alg: quiche::crypto::Algorithm::AES256_GCM, secret: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x9b91bb}, _marker: core::marker::PhantomData}, cap: 320970447, alloc: alloc::alloc::Global}, len: 0}, header: quiche::crypto::HeaderProtectionKey {hpk: ring::aead::quic::HeaderProtectionKey {inner: ring::aead::quic::KeyInner::Aes(ring::aead::aes::Key {inner: ring::aead::aes::AES_KEY {rd_key: [0, 8, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 8, 0, 4150715085, 32767,
1433443744, 21845, 6, 0, 2, 0, 0, 0, 8, 0, 80, 0, 4152011904,
32767, 4150715085, 32767, 1433443840, 21845, 3, 0, 1433427032,
21845, 4150717449, 32767, 999999999, 0, 40, 0, 4152011904, 32767,
4294967120, 4294967295, 0, 0, 4294901056, 32767,
40], rounds: 0}, cpu_features: ring::cpu::Features (())}), algorithm: 0xa}, hp_key: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x0}, _marker: core::marker::PhantomData}, cap: 140737344105481, alloc: alloc::alloc::Global}, len: 0}}, packet: quiche::crypto::PacketKey {ctx: quiche::crypto::EVP_AEAD_CTX {aead: 20, opaque: [64, 131, 108, 85, 85, 85, 0, 0, 20, 0 , 17,
0, 0, 0, 0, 0, 0, 0, 176, 136, 108, 85, 85, 85, 0, 0, 17,
0 , 137, 163, 97, 81, 222, 172, 135, 7, 0, 0, 0, 0,
0, 0, 0, 0, 91, 152, 129, 225, 137, 92, 52, 121, 176, 153, 252, 247,
255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 209, 254, 255, 255, 127,
0, 0, 1, 0, 0, 0, 2, 0 , 202, 154, 59,
0 , 187, 145, 155, 0, 0, 0, 0, 0, 175, 158, 33, 19,
0, 0, 0, 0, 187, 145, 155, 0, 0, 0, 0, 0, 175, 158, 33, 19, 0, 0, 0, 0,
187, 145, 155, 0, 0, 0, 0, 0, 175, 158, 33, 19, 3,
0 , 187, 145, 155, 0, 0, 0, 0, 0, 190, 158, 33, 19,
0 ,
187...], alignment: 0, tag_len: 0}, nonce: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x2ee0}, _marker: core::marker::PhantomData}, cap: 1200, alloc: alloc::alloc::Global}, len: 0}}}, quiche::crypto::Seal {alg: quiche::crypto::Algorithm::AES128_GCM, secret: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x1}, _marker: core::marker::PhantomData}, cap: 20, alloc: alloc::alloc::Global}, len: 140737350330631}, header: quiche::crypto::HeaderProtectionKey {hpk: ring::aead::quic::HeaderProtectionKey {inner: ring::aead::quic::KeyInner::Aes(ring::aead::aes::Key {inner: ring::aead::aes::AES_KEY {rd_key: [0, 10195387, 0,
320970259, 0, 0, 0, 0, 0, 10195387, 0, 320970259, 0, 0, 0, 0, 0,
10195387, 0, 320970259, 0 , 2,
0 , 1000000000, 0, 0, 0, 1000000000, 0, 0, 0,
1000000000], rounds: 0}, cpu_features: ring::cpu::Features (())}), algorithm: 0x0}, hp_key: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x3b9aca00}, _marker: core::marker::PhantomData}, cap: 0, alloc: alloc::alloc::Global}, len: 0}}, packet: quiche::crypto::PacketKey {ctx: quiche::crypto::EVP_AEAD_CTX {aead: 0, opaque: [160, 142, 112, 85, 85, 85, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 200,
1, 0, 0, 0, 0, 0, 0, 144, 183, 230, 247, 255, 127, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 158, 112, 85, 85, 85, 0, 0, 40, 0,
0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 64, 253, 254, 255, 255, 127,
0, 0, 240, 110, 112, 85, 85, 85, 0, 0, 48, 156, 200, 247, 255, 127,
0 , 255 , 0 ,
255 , 0 , 187, 145, 155, 0, 0, 0,
0, 0, 222, 158, 33, 19, 0 , 187, 145, 155, 0, 0, 0,
0, 0, 222, 158, 33, 19, 0 , 187, 145, 155, 0, 0, 0,
0, 0, 222, 158, 33,
19...], alignment: 8, tag_len: 0}, nonce: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x0}, _marker: core::marker::PhantomData}, cap: 0, alloc: alloc::alloc::Global}, len: 8}}}))
qlog_frames = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x55555570e378}, _marker: core::marker::PhantomData}, cap: 93824994026072, alloc: alloc::alloc::Global}, len: 0}
pn_len =
pn =
aead_tag_len = 16
aead =
aead =
epoch = quiche::packet::Epoch::Application
payload_len =
hdr = quiche::packet::Header {ty: quiche::packet::Type::Initial, version: 0, dcid: quiche::packet::ConnectionId (), scid: quiche::packet::ConnectionId (), pkt_num: 93824993757360, pkt_num_len: 17, token: core::option::Option>::Some(alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x2}, _marker: core::marker::PhantomData}, cap: 4, alloc: alloc::alloc::Global}, len: 542592350969504649}), versions: core::option::Option>::Some(alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: core::ptr::non_null::NonNull {pointer: 0x79345c89e181985b}, _marker: core::marker::PhantomData}, cap: 0, alloc: alloc::alloc::Global}, len: 140737353914800}), key_phase: false}
b = octets::OctetsMut {buf: &mut [u8] , off: 140737488277888}
buf_len =
now =
is_closing =
buf_len =
b =
val =
hdr =
lvl =
versions =
supported_versions =
found_version =
iter =
v =
aead_open =
aead_seal =
residual =
val =
residual =
val =
residual =
val =
payload_len =
aead_seal =
aead_open =
epoch =
aead =
pkt_len =
pkt =
aead =
aead_tag_len =
pn =
pn_len =
lvl =
qlog_frames =
aead_next =
key_update =
lvl =
val =
val =
payload =
pkt_dcid =
residual =
val =
lvl =
recv_pid =
open_next =
seal_next =
lvl =
open_prev =
recv_path =
q =
trigger =
ev_data_client =
ev_data_server =
residual =
val =
ack_elicited =
frame_processing_err =
probing =
val =
frame =
_q =
e =
q =
packet_size =
qlog_pkt_hdr =
qlog_raw_info =
ev_data =
q =
recv_path =
ev_data =
residual =
val =
e =
q =
ev_data =
iter =
p =
iter =
acked =
ranges =
largest_acked =
offset =
length =
stream_id =
stream =
local =
v =
stream_id =
offset =
length =
stream =
q =
ev_data =
local =
v =
no_dcid =
iter =
pid =
p =
dcid_seq =
residual =
val =
seq =
active_path_id =
residual =
val =
idle_timeout =
read =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
residual =
val =
residual =
residual =
val =
v =
e =
residual =
val =
residual =
val =
lvl =
aead_open =
aead_seal =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
val =
residual =
#14 quiche::Connection::recv (self=0x55555570a110, buf=..., info=...)
at quiche/src/lib.rs:2128
left =
done =
recv_pid = core::option::Option::None
len =
#15 0x00007ffff7c9518b in quiche::ffi::quiche_conn_recv (conn=0x55555570a110,
buf=0x7ffffffed180, buf_len=1280, info=0x7ffffffecf70) at quiche/src/ffi.rs:726
buf = &mut [u8] [225, 0, 0, 0, 1, 20, 60, 34, 124, 40, 179, 157, 143, 208, 178,
240, 223, 227, 77, 108, 180, 217, 191, 187, 184, 81, 17, 135, 112, 22, 253, 106,
166, 59, 31, 18, 158, 165, 196, 235, 192, 204, 14, 186, 67, 182, 0, 4, 6, 77,
142, 67, 159, 139, 58, 198, 221, 39, 81, 110, 255, 188, 100, 245, 51, 67, 79, 2,
3, 1, 0, 1, 163, 130, 1, 70, 48, 130, 1, 66, 48, 15, 6, 3, 85, 29, 19, 1, 1, 255,
4, 5, 48, 3, 1, 1, 255, 48, 14, 6, 3, 85, 29, 15, 1, 1, 255, 4, 4, 3, 2, 1, 6,
48, 75, 6, 8, 43, 6, 1, 5, 5, 7, 1, 1, 4, 63, 48, 61, 48, 59, 6, 8, 43, 6, 1, 5,
5, 7, 48, 2, 134, 47, 104, 116, 116, 112, 58, 47, 47, 97, 112, 112, 115, 46, 105,
100, 101, 110, 116, 114, 117, 115, 116, 46, 99, 111, 109, 47, 114, 111, 111, 116,
115, 47, 100, 115, 116, 114, 111, 111, 116, 99, 97, 120, 51, 46, 112, 55, 99, 48,
31, 6, 3, 85, 29, 35, 4, 24, 48...]
#16 0x0000555555632fc7 in recv_pkt (pkt=0x7ffffffed180 ,
pktlen=1280, remote_addr=0x7ffffffed100, remote_addrlen=28, ecn=0, userp=0x7fffffffd260)
at vquic/curl_quiche.c:681
r = 0x7fffffffd260
ctx = 0x555555705b28
recv_info = {from = 0x7ffffffed100, from_len = 28, to = 0x555555705b30, to_len = 28}
nread = 140737344575706
#17 0x00005555555d3957 in recvmsg_packets (cf=0x555555705d18, data=0x5555556e8948,
qctx=0x555555705b28, max_pkts=1000, recv_cb=0x555555632f3a ,
userp=0x7fffffffd260) at vquic/vquic.c:458
msg_iov = {iov_base = 0x7ffffffed180, iov_len = 65536}
msg = {msg_name = 0x7ffffffed100, msg_namelen = 28, msg_iov = 0x7fffffffd1c0,
msg_iovlen = 1, msg_control = 0x0, msg_controllen = 0, msg_flags = 0}
buf = "\341\000\000\000\001\024<\"|(\263\235\217в\360\337\343Ml\264ٿ\273\270Q\021\207p\026\375j\246;\037\022\236\245\304\353\300\314\016\272C\266\000\004\006M\216C\237\213:\306\335'Qn\377\274d\3653CO\002\003\001\000\001\243\202\001F0\202\001B0\017\006\003U\035\023\001\001\377\004\0050\003\001\001\3770\016\006\003U\035\017\001\001\377\004\004\003\002\001\0060K\006\b+\006\001\005\005\a\001\001\004?0=0;\006\b+\006\001\005\005\a0\002\206/http://apps.identrust.com/roots/dstrootcax3.p7c0\037\006\003U\035#\004\0300\026\200"...
remote_addr = {ss_family = 10,
__ss_padding = "\001\273\000\000\000\000*\004NB\006\000\000\000\000\000\000\000\000\000\003G\000\000\000\000\377\377\377\377", '\000' , __ss_align = 0}
total_nread = 2560
pkts = 2
nread = 1280
errstr = '\000' , "\t\000\000\000\020\000\000\000\000\000\000\000\260\213lUUU\000\000\020\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\000\236pUUU\000\000(\000\000\000\000\000\000\000(\000\000\000\000\000\000\000@\375\376\377\377\177\000\000\360npUUU\000\0000\234\310\367\377\177", '\000' ...
result = CURLE_OK
__PRETTY_FUNCTION__ = "recvmsg_packets"
#18 0x00005555555d3a05 in vquic_recv_packets (cf=0x555555705d18, data=0x5555556e8948,
qctx=0x555555705b28, max_pkts=1000, recv_cb=0x555555632f3a ,
userp=0x7fffffffd260) at vquic/vquic.c:542
result = 21845
#19 0x000055555563318a in cf_process_ingress (cf=0x555555705d18, data=0x5555556e8948)
at vquic/curl_quiche.c:725
ctx = 0x555555705b28
rctx = {cf = 0x555555705d18, data = 0x5555556e8948, pkts = 2}
result = CURLE_OK
__PRETTY_FUNCTION__ = "cf_process_ingress"
#20 0x000055555563518b in cf_quiche_connect (cf=0x555555705d18, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at vquic/curl_quiche.c:1490
ctx = 0x555555705b28
result = CURLE_OK
#21 0x00005555555dd1eb in Curl_conn_cf_connect (cf=0x555555705d18, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at cfilters.c:296
No locals.
#22 0x00005555555e0186 in baller_connect (cf=0x555555705228, data=0x5555556e8948,
baller=0x555555705268, now=0x7fffffffd3a0, connected=0x7fffffffd637) at connect.c:553
No locals.
#23 0x00005555555e030d in is_connected (cf=0x555555705228, data=0x5555556e8948,
connected=0x7fffffffd637) at connect.c:608
baller = 0x555555705268
ctx = 0x5555557051c8
conn = 0x5555556e7828
result = 21845
now = {tv_sec = 10195221, tv_usec = 343405}
i = 0
ongoing = 0
not_started = 0
hostname = 0x5555556e8948 "\255\333\336\300"
#24 0x00005555555e0ea9 in cf_he_connect (cf=0x555555705228, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at connect.c:906
ctx = 0x5555557051c8
result = CURLE_OK
__PRETTY_FUNCTION__ = "cf_he_connect"
#25 0x00005555555dd1eb in Curl_conn_cf_connect (cf=0x555555705228, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at cfilters.c:296
No locals.
#26 0x00005555555e17eb in cf_setup_connect (cf=0x555555705188, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at connect.c:1201
ctx = 0x555555705158
result = CURLE_OK
#27 0x00005555555dd1eb in Curl_conn_cf_connect (cf=0x555555705188, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at cfilters.c:296
No locals.
#28 0x000055555563be24 in cf_hc_baller_connect (b=0x5555557050d0, cf=0x5555556e88e8,
data=0x5555556e8948, done=0x7fffffffd637) at cf-https-connect.c:135
save = 0x0
#29 0x000055555563c509 in cf_hc_connect (cf=0x5555556e88e8, data=0x5555556e8948,
blocking=false, done=0x7fffffffd637) at cf-https-connect.c:276
ctx = 0x5555557050a8
now = {tv_sec = 10195221, tv_usec = 343405}
result = CURLE_OK
__PRETTY_FUNCTION__ = "cf_hc_connect"
#30 0x00005555555dd457 in Curl_conn_connect (data=0x5555556e8948, sockindex=0,
blocking=false, done=0x7fffffffd637) at cfilters.c:351
cf = 0x5555556e88e8
result = CURLE_OK
__PRETTY_FUNCTION__ = "Curl_conn_connect"
#31 0x00005555555a4ebe in multi_runsingle (multi=0x5555556e7638, nowp=0x7fffffffd760,
data=0x5555556e8948) at multi.c:2100
stream_error = false
msg = 0x0
connected = false
async = false
protocol_connected = false
dophase_done = false
done = false
rc = CURLM_OK
result = CURLE_OK
recv_timeout_ms = 93824993892984
send_timeout_ms = 93823560924525
control = 1433424040
__PRETTY_FUNCTION__ = "multi_runsingle"
#32 0x00005555555a6606 in curl_multi_perform (multi=0x5555556e7638,
running_handles=0x7fffffffd7c4) at multi.c:2740
datanext = 0x0
result = CURLM_OK
nosig = false
pipe_st = {old_pipe_act = {__sigaction_handler = {sa_handler = 0x1,
sa_sigaction = 0x1}, sa_mask = {__val = {4096, 5, 0, 0, 4294967296,
93824994005248, 93824994005160, 8589923792, 1, 5, 2, 140737488344544,
140737344514611, 10195221, 140733193388033, 2}}, sa_flags = 335544320,
sa_restorer = 0x7ffff7613510 <__restore_rt>}, no_signal = false}
data = 0x5555556e8948
returncode = CURLM_OK
t = 0x0
now = {tv_sec = 10195221, tv_usec = 343405}
__PRETTY_FUNCTION__ = "curl_multi_perform"
#33 0x0000555555595233 in easy_transfer (multi=0x5555556e7638) at easy.c:679
still_running = 0
done = false
mcode = CURLM_OK
result = CURLE_OK
#34 0x0000555555595467 in easy_perform (data=0x5555556e8948, events=false) at easy.c:769
multi = 0x5555556e7638
mcode = CURLM_OK
result = CURLE_OK
pipe_st = {old_pipe_act = {__sigaction_handler = {sa_handler = 0x1,
sa_sigaction = 0x1}, sa_mask = {__val = {4096, 93824993872768, 31,
140737488344800, 93824992521554, 140737488346024, 93824993354456,
93824993892792, 93824993892792, 0, 93824993892376, 140737488344912,
93824992576528, 93824993349616, 5, 140733193725499}}, sa_flags = 335544320,
sa_restorer = 0x7ffff7613510 <__restore_rt>}, no_signal = false}
#35 0x00005555555954b1 in curl_easy_perform (data=0x5555556e8948) at easy.c:788
No locals.
#36 0x0000555555587eda in serial_transfers (global=0x7fffffffda10, share=0x5555556e40e8)
at tool_operate.c:2689
retry = false
delay_ms = 93824993872544
bailout = false
start = {tv_sec = 10195387, tv_usec = 318836}
returncode = CURLE_OK
result = CURLE_OK
per = 0x5555556e4c48
added = true
#37 0x00005555555884a8 in run_all_transfers (global=0x7fffffffda10, share=0x5555556e40e8,
result=CURLE_OK) at tool_operate.c:2880
orig_noprogress = false
orig_isatty = false
per = 0x556e40e8
#38 0x0000555555588853 in operate (global=0x7fffffffda10, argc=3, argv=0x7fffffffdba8)
at tool_operate.c:2996
count = 1
operation = 0x0
share = 0x5555556e40e8
res = PARAM_OK
result = CURLE_OK
first_arg = 0x0
#39 0x000055555557e615 in main (argc=3, argv=0x7fffffffdba8) at tool_main.c:272
result = CURLE_OK
global = {showerror = false, silent = false, noprogress = true, isatty = true,
trace_dump = 0x0, trace_stream = 0x0, trace_fopened = false,
tracetype = TRACE_NONE, tracetime = false, traceids = false, progressmode = 0,
libcurl = 0x0, fail_early = false, styled_output = true, ms_per_transfer = 0,
test_event_based = false, parallel = false, parallel_max = 50,
parallel_connect = false, help_category = 0x0, variables = 0x0,
first = 0x5555556e2268, current = 0x5555556e2268, last = 0x5555556e2268}
(gdb)
Contributor guide
Research direction
Reproduce the crash with ./src/curl --http3-only https://curl.se/ under the Linux, quiche, and BoringSSL setup described. Start by reading quiche/src/tls.rs and quiche/src/lib.rs, then compare the GDB stack through BoringSSL's certificate-processing path. Done means identifying and validating a fix for the HTTP/3 handshake crash without regressing the working HTTP/1 and HTTP/2 requests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- networking
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100