private-octopus / picoquic

Minimal implementation of the QUIC protocol
MIT License
523 stars 153 forks source link

Possible race condition with stream reset causing PICOQUIC_TRANSPORT_STREAM_STATE_ERROR #1597

Closed TimEvens closed 6 months ago

TimEvens commented 6 months ago

We are resetting roughly 4 streams at the same time every 5 seconds (upon GOP change). We have noticed that durning packet loss/retransmits we hit PICOQUIC_TRANSPORT_STREAM_STATE_ERR that causes the connection to close. It has been very hard to reproduce this. I added an abort() at line 60 to get a backtrace of when this happens. I also added an fprintf() to log the current and next stream ids.

It should be noted, we have only seen this issue with transmit. We do not see this issue with receive resets.

Our log showing some resets and then the error causing the connection to close.

2023-12-15T13:21:32.716787 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 4 closing stream stream_id: 419
2023-12-15T13:21:32.717118 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 419 conn_id: 548816652048
2023-12-15T13:21:32.717339 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 4 existing_stream: 419 write buf drops: 0 tx_queue_discards: 2
2023-12-15T13:21:32.717479 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 4 create new stream with stream_id: 431
2023-12-15T13:21:32.718185 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 5 closing stream stream_id: 415
2023-12-15T13:21:32.718364 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 415 conn_id: 548816652048
2023-12-15T13:21:32.718558 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 5 existing_stream: 415 write buf drops: 1 tx_queue_discards: 2
2023-12-15T13:21:32.718682 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 5 create new stream with stream_id: 435
2023-12-15T13:21:35.176277 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 4 closing stream stream_id: 431
2023-12-15T13:21:35.177189 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 431 conn_id: 548816652048
2023-12-15T13:21:35.177879 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 4 existing_stream: 431 write buf drops: 0 tx_queue_discards: 3
2023-12-15T13:21:35.178639 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_cix_id: 4 create new stream with stream_id: 439
2023-12-15T13:21:35.203268 [INFO] [CMGR] [QSES] [QUIC] Received RESET stream conn_id: 548816652048 stream_id: 306
2023-12-15T13:21:35.204311 [INFO] [CMGR] [QSES] [QUIC] Received RESET stream; conn_id: 548816652048 data_ctx_id: 0 stream_id: 306 RX buf drops: 0
2023-12-15T13:21:35.204813 [DEBUG] [CMGR] [QSES] [QUIC] Adding received conn_id: 548816652048 data_ctx_id: 0 stream_id: 314 into RX buffer
2023-12-15T13:21:37.412854 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 2 closing stream stream_id: 423
2023-12-15T13:21:37.413879 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 423 conn_id: 548816652048
2023-12-15T13:21:37.414532 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 2 existing_stream: 423 write buf drops: 0 tx_queue_discards: 0
2023-12-15T13:21:37.415121 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 2 create new stream with stream_id: 443
2023-12-15T13:21:37.672577 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 4 closing stream stream_id: 439
2023-12-15T13:21:37.672881 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 439 conn_id: 548816652048
2023-12-15T13:21:37.673119 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 4 existing_stream: 439 write buf drops: 0 tx_queue_discards: 3
2023-12-15T13:21:37.673376 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 4 create new stream with stream_id: 447
2023-12-15T13:21:37.687618 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 5 closing stream stream_id: 435
2023-12-15T13:21:37.687921 [INFO] [CMGR] [QSES] [QUIC] Reset stream_id: 435 conn_id: 548816652048
2023-12-15T13:21:37.688157 [INFO] [CMGR] [QSES] [QUIC] Replacing stream using RESET; conn_id: 548816652048 data_ctx_id: 5 existing_stream: 435 write buf drops: 1 tx_queue_discards: 2
2023-12-15T13:21:37.688388 [INFO] [CMGR] [QSES] [QUIC] conn_id: 548816652048 data_ctx_id: 5 create new stream with stream_id: 451

====>> frame.c L#60 ---> stream error stream_id: 423 next_id: 455
Thread 15 "lapsRelay" received signal SIGABRT, Aborted.

Backtrace showing picoquic_process_ack_of_reset_stream_frame() recreating the stream, causing the issue

(gdb) bt full
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {0, 3707729072, 0, 545460846597, 0, 545460846593, 549621592608, 549168575904, 549621441292, 366506870264, 549168582976, 549168584768, 549168576472, 549168575872, 549617650244, 548817310766}}
        pid = <optimized out>
        tid = <optimized out>
        ret = <optimized out>
#1  0x0000007ff7c3caa0 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = 0x2a, sa_sigaction = 0x2a}, sa_mask = {__val = {549621585472, 2676586395008836901, 2676586395008836901, 2592, 8295742064141103683, 7792670384392073844, 7958552634295722101, 18446744073709486080,
              0, 0, 0, 4616194021471027200, 0, 4503599627370496, 0, 4616194021471028225}}, sa_flags = 1074791425, sa_restorer = 0x55558305f8 <abort@got.plt>}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00000055555f3184 in picoquic_create_missing_streams (is_remote=0, stream_id=423, cnx=0x7fc8058710) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:62
        stream = <optimized out>
        expect_client_stream = <optimized out>
        stream = <optimized out>
        expect_client_stream = <optimized out>
#3  picoquic_create_missing_streams (cnx=0x7fc8058710, stream_id=423, is_remote=<optimized out>) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:42
        stream = 0x0
        expect_client_stream = <optimized out>
#4  0x00000055555f3a14 in picoquic_find_or_create_stream (is_remote=0, stream_id=423, cnx=0x7fc8058710) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:175
        stream = <optimized out>
        stream = <optimized out>
#5  picoquic_process_ack_of_reset_stream_frame (cnx=cnx@entry=0x7fc8058710, bytes=<optimized out>, bytes@entry=0x7fc80f942e "\004A\247", bytes_size=27, consumed=consumed@entry=0x7fdcff77d8)
    at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:326
        ret = 0
        byte_first = 0x7fc80f942e "\004A\247"
        bytes_max = 0x7fc80f9449 ""
        stream_id = 423
        stream = <optimized out>
#6  0x00000055555fc960 in picoquic_process_ack_of_frames (cnx=cnx@entry=0x7fc8058710, p=p@entry=0x7fc80f9360, is_spurious=is_spurious@entry=0, current_time=current_time@entry=1702675297877257)
    at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:3288
        ftype = 4
        l_ftype = <optimized out>
        ret = 0
        byte_index = <optimized out>
        frame_is_pure_ack = 0
        frame_length = 8
#7  0x00000055555fd4c8 in picoquic_process_ack_range (pc=<optimized out>, packet_data=<optimized out>, current_time=<optimized out>, ppacket=<optimized out>, range=312, highest=137070, pkt_ctx=<optimized out>, cnx=<optimized out>)
    at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:3395
        next = 0x7fc8108de0
        old_path = 0x7fc805bbf0
        p = 0x7fc80f9360
        ret = <optimized out>
        p = <optimized out>
        ret = <optimized out>
        next = <optimized out>
        old_path = <optimized out>
#8  picoquic_decode_ack_frame (cnx=cnx@entry=0x7fc8058710, bytes=0x7fc80e5c56 "\200\002\027p", bytes_max=bytes_max@entry=0x7fc80e5c67 "\363\t", current_time=current_time@entry=1702675297877257, epoch=epoch@entry=3, is_ecn=<optimized out>,
    has_path_id=<optimized out>, packet_data=<optimized out>) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:3500
        range = 322
        block_to_block = 366504627900
        time_stamp = 0
        is_new_ack = <optimized out>
        top_packet = <optimized out>
        p_retransmitted_previous = <optimized out>
        path_id = 0
        num_block = 0
        largest = 137080
        ack_delay = 1120
        consumed = 8
        pc = <optimized out>
        ecnx3 = {0, 0, 0}
        first_byte = <optimized out>
        pkt_ctx = 0x7fc80591a8
        largest_in_path = <optimized out>
        ack_path = <optimized out>
        __func__ = "picoquic_decode_ack_frame"
#9  0x00000055555fd9b0 in picoquic_decode_frames (cnx=cnx@entry=0x7fc8058710, path_x=<optimized out>, bytes=<optimized out>, bytes_maxsize=<optimized out>, received_data=received_data@entry=0x7fc80e5c00, epoch=3,
    addr_from=addr_from@entry=0x7fdcff8000, addr_to=addr_to@entry=0x7fdcff8080, pn64=<optimized out>, path_is_not_allocated=<optimized out>, path_is_not_allocated@entry=0, current_time=<optimized out>, current_time@entry=1702675297877257)
    at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/frames.c:5451
        first_byte = <optimized out>
        is_path_probing_frame = 0
        bytes_max = 0x7fc80e5c67 "\363\t"
        ack_needed = <optimized out>
        is_path_probing_packet = 1
--Type <RET> for more, q to quit, c to continue without paging--
        pc = <optimized out>
        packet_data = {last_time_stamp_received = 0, last_ack_delay = 1120, nb_path_ack = 1, path_ack = {{acked_path = 0x7fc805bbf0, largest_sent_time = 1702675297765117, delivered_prior = 160807516, delivered_time_prior = 1702675297434495,
              delivered_sent_prior = 1702675297400878, rs_is_path_limited = 1, is_set = 1, data_acked = 11637}, {acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0,
              rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0, rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {
              acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0, rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0,
              delivered_time_prior = 0, delivered_sent_prior = 0, rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0,
              rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0, rs_is_path_limited = 0, is_set = 0, data_acked = 0}, {
              acked_path = 0x0, largest_sent_time = 0, delivered_prior = 0, delivered_time_prior = 0, delivered_sent_prior = 0, rs_is_path_limited = 0, is_set = 0, data_acked = 0}}}
        __func__ = "picoquic_decode_frames"
#10 0x000000555560ab98 in picoquic_incoming_1rtt (cnx=0x7fc8058710, path_id=0, bytes=bytes@entry=0x7fc80e5c40 "b\340\314\071G@\237\204\b\002\027\r\003\200\002\027x@\214", received_data=received_data@entry=0x7fc80e5c00, ph=ph@entry=0x7fdcff7cf8,
    addr_from=addr_from@entry=0x7fdcff8000, addr_to=addr_to@entry=0x7fdcff8080, if_index_to=if_index_to@entry=2, received_ecn=<optimized out>, received_ecn@entry=0 '\000', path_is_not_allocated=<optimized out>, path_is_not_allocated@entry=0,
    current_time=<optimized out>, current_time@entry=1702675297877257) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/packet.c:2030
        path_x = 0x7fc805bbf0
        ret = 0
#11 0x000000555560b4c0 in picoquic_incoming_segment (quic=quic@entry=0x555586e4d0,
    raw_bytes=raw_bytes@entry=0x7fdcff8200 "a\340\314\071G@\237\204\b\346\260\341\b\210>\221\362\202Ҏ\333\006R|\"\036\020\325\227S\241={n\f\327g\360\270\253hU \347\276W\261\036%Y\354|\355\373\261\310\001\\_\r»\261\360\241+\337ۦ\355\264\v|\306\n\322W\300FD\336\025\336\070\357\064\n\257\066\300\247\376+f/瓨6\214\210o\274VxbVl\337~\004\207\373\254\223\365\353\367W\036\a\003\302D\344\067\336(Fq\234+\366\304\351\301\034i\006v\235\343\213\027n\222~\376Ο\230iƮ\264\376h\372\005ΦR\314\fXM#\312\347 \276\343J)\224\374o\211\060BV\226\270\006\376\001\354;\242(\024\037\r\316\320X\351j", <incomplete sequence \333>..., length=length@entry=55, packet_length=packet_length@entry=55, consumed=consumed@entry=0x7fdcff7e30,
    addr_from=addr_from@entry=0x7fdcff8000, addr_to=addr_to@entry=0x7fdcff8080, if_index_to=if_index_to@entry=2, received_ecn=<optimized out>, received_ecn@entry=0 '\000', current_time=<optimized out>, current_time@entry=1702675297877257,
    receive_time=<optimized out>, receive_time@entry=1702675297877257, previous_dest_id=<optimized out>, previous_dest_id@entry=0x7fdcff7e38, first_cnx=<optimized out>, first_cnx@entry=0x7fdcff7fd8)
    at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/packet.c:2331
        ret = 0
        cnx = 0x7fc8058710
        ph = {dest_cnx_id = {id = "\340\314\071G@\237\204\b", '\000' <repeats 11 times>, id_len = 8 '\b'}, srce_cnx_id = {id = '\000' <repeats 19 times>, id_len = 0 '\000'}, pn = 136973, vn = 0, offset = 12, pn_offset = 9,
          ptype = picoquic_packet_1rtt_protected, pnmask = 18446744073692774400, pn64 = 136973, payload_length = 27, version_index = 0, epoch = picoquic_epoch_1rtt, pc = picoquic_packet_context_application, key_phase = 0, spin = 1,
          has_spin_bit = 1, has_reserved_bit_set = 0, has_loss_bits = 1, loss_bit_Q = 0, loss_bit_L = 0, quic_bit_is_zero = 0, token_length = 0, token_bytes = 0x0, pl_val = 0, l_cid = 0x7fc803af70}
        new_context_created = 0
        is_first_segment = <optimized out>
        is_buffered = 0
        path_id = 0
        path_is_not_allocated = 0
        bytes = <optimized out>
        decrypted_data = 0x7fc80e5c00
        __func__ = "picoquic_incoming_segment"
#12 0x000000555560bbdc in picoquic_incoming_packet_ex (quic=quic@entry=0x555586e4d0,
    bytes=bytes@entry=0x7fdcff8200 "a\340\314\071G@\237\204\b\346\260\341\b\210>\221\362\202Ҏ\333\006R|\"\036\020\325\227S\241={n\f\327g\360\270\253hU \347\276W\261\036%Y\354|\355\373\261\310\001\\_\r»\261\360\241+\337ۦ\355\264\v|\306\n\322W\300FD\336\025\336\070\357\064\n\257\066\300\247\376+f/瓨6\214\210o\274VxbVl\337~\004\207\373\254\223\365\353\367W\036\a\003\302D\344\067\336(Fq\234+\366\304\351\301\034i\006v\235\343\213\027n\222~\376Ο\230iƮ\264\376h\372\005ΦR\314\fXM#\312\347 \276\343J)\224\374o\211\060BV\226\270\006\376\001\354;\242(\024\037\r\316\320X\351j", <incomplete sequence \333>..., packet_length=packet_length@entry=55, addr_from=addr_from@entry=0x7fdcff8000, addr_to=addr_to@entry=0x7fdcff8080, if_index_to=2,
    received_ecn=0 '\000', first_cnx=first_cnx@entry=0x7fdcff7fd8, current_time=current_time@entry=1702675297877257) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/packet.c:2437
        consumed = 55
        consumed_index = 0
        ret = 0
        previous_destid = {id = "\340\314\071G@\237\204\b", '\000' <repeats 11 times>, id_len = 8 '\b'}
        __func__ = "picoquic_incoming_packet_ex"
#13 0x0000005555620544 in picoquic_packet_loop (quic=<optimized out>, local_port=<optimized out>, local_af=<optimized out>, dest_if=0, socket_buffer_size=2000000, do_not_use_gso=<optimized out>,
    loop_callback=0x55555d1bec <pq_loop_cb(st_picoquic_quic_t*, picoquic_packet_loop_cb_enum, void*, void*)>, loop_callback_ctx=0x555586bf80) at /ws/dependencies/libquicr/dependencies/transport/dependencies/picoquic/picoquic/sockloop.c:329
        current_recv_port = <optimized out>
        loop_time = 1702675297877257
        socket_rank = 1
        delta_t = <optimized out>
        received_ecn = 0 '\000'
        ret = 0
        current_time = 1702675297877257
        delay_max = <optimized out>
        addr_from = {ss_family = 10, __ss_padding = "\346i\000\000\000\000&\001\006\000\311\000\nlŃ\244}\237E\342\236", '\000' <repeats 95 times>, __ss_align = 0}
        addr_to = {ss_family = 10, __ss_padding = "\233\202\000\000\000\000&\001\006\000\311\000\nl4_\335\366\325.0\257", '\000' <repeats 95 times>, __ss_align = 0}
        if_index_to = 2
        buffer = "a\340\314\071G@\237\204\b\346\260\341\b\210>\221\362\202Ҏ\333\006R|\"\036\020\325\227S\241={n\f\327g\360\270\253hU \347\276W\261\036%Y\354|\355\373\261\310\001\\_\r»\261\360\241+\337ۦ\355\264\v|\306\n\322W\300FD\336\025\336\070\357\064\n\257\066\300\247\376+f/瓨6\214\210o\274VxbVl\337~\004\207\373\254\223\365\353\367W\036\a\003\302D\344\067\336(Fq\234+\366\304\351\301\034i\006v\235\343\213\027n\222~\376Ο\230iƮ\264\376h\372\005ΦR\314\fXM#\312\347 \276\343J)\224\374o\211\060BV\226\270\006\376\001\354;\242(\024\037\r\316\320X\351j|\333\302#\203\320rIQ\222\267"...
        send_buffer = <optimized out>
        send_length = 0
        send_msg_size = 1440
        send_buffer_size = <optimized out>
        send_msg_ptr = <optimized out>
        bytes_recv = 55
        log_cid = {id = "\361s\263\226T\263\337\377", '\000' <repeats 11 times>, id_len = 8 '\b'}
        s_socket = {8, 9}
        sock_af = {2, 10}
        sock_ports = {33435, 33435}
        nb_sockets = <optimized out>
        testing_migration = <optimized out>
        next_port = 0
        last_cnx = 0x7fc8058710
--Type <RET> for more, q to quit, c to continue without paging--
        loop_immediate = 0
        options = {do_time_check = -1}
        next_send_time = <optimized out>
#14 0x00000055555d5e44 in qtransport::PicoQuicTransport::server (this=0x555586bf80) at /ws/dependencies/libquicr/dependencies/transport/src/transport_picoquic.cpp:1387
        ret = 85
#15 0x00000055555e9af4 in std::__invoke_impl<void, void (qtransport::PicoQuicTransport::*)(), qtransport::PicoQuicTransport*> (
    __f=@0x5555874220: (void (qtransport::PicoQuicTransport::*)(qtransport::PicoQuicTransport * const)) 0x55555d5dfc <qtransport::PicoQuicTransport::server()>, __t=@0x5555874218: 0x555586bf80) at /usr/include/c++/10/bits/invoke.h:73
No locals.
#16 0x00000055555e9850 in std::__invoke<void (qtransport::PicoQuicTransport::*)(), qtransport::PicoQuicTransport*> (
    __fn=@0x5555874220: (void (qtransport::PicoQuicTransport::*)(qtransport::PicoQuicTransport * const)) 0x55555d5dfc <qtransport::PicoQuicTransport::server()>) at /usr/include/c++/10/bits/invoke.h:95
No locals.
#17 0x00000055555e9690 in std::thread::_Invoker<std::tuple<void (qtransport::PicoQuicTransport::*)(), qtransport::PicoQuicTransport*> >::_M_invoke<0ul, 1ul> (this=0x5555874218) at /usr/include/c++/10/thread:264
No locals.
#18 0x00000055555e9594 in std::thread::_Invoker<std::tuple<void (qtransport::PicoQuicTransport::*)(), qtransport::PicoQuicTransport*> >::operator() (this=0x5555874218) at /usr/include/c++/10/thread:271
No locals.
#19 0x00000055555e94f0 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (qtransport::PicoQuicTransport::*)(), qtransport::PicoQuicTransport*> > >::_M_run (this=0x5555874210) at /usr/include/c++/10/thread:215
No locals.
#20 0x0000007ff7e7ecac in ?? () from /lib/aarch64-linux-gnu/libstdc++.so.6
No symbol table info available.
#21 0x0000007ff7f94648 in start_thread (arg=0x7fdcff8a40) at pthread_create.c:477
        ret = <optimized out>
        pd = 0x7fdcff8a40
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {549168584028, 549755807024, 549755807022, 549755807720, 549755807023, 549168581184, 0, 549621321728, 549621560512, 549168582976, 549168580896, 8353765359909376119, 0, 8353765359221365767, 0, 0,
                0, 0, 0, 0, 0, 0}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#22 0x0000007ff7ceec1c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
No locals.
(gdb)
huitema commented 6 months ago

Thanks for the report and the detailed log. I think that I understand the issue. Per RFC 9000, stream are "auto-created" the first time a peer refers to them in any frame with a "stream-id" in them. The big issue is that we do not distinguish between "this stream was already created and is now closed" and "this stream was not yet created". I need a better check there.