mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
188c055a9c
* Test case and debug for lsquic rechist list problem Add: - test case - debug rechist print function (not called) Modify: - rechist_test_sanity to be more robust Test case: Added test case which produces a corrupt rechist. The rechist grows and then is emptied, then a rechist is produced that is nominally empty (rh_n_used == 0) but has a circular list in rh_elems. E.g. (using debug print at the problem site): lsquic_rechist_received: insert before done 0x7ffe65ce75a0: cutoff 9 l. acked 12087061905995 masks 1 alloced 4 used 1 max ranges 0 head 0 (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] (0)[9-9] test_rechist: /tmp/lsquic/src/liblsquic/lsquic_rechist.c:272: rechist_test_sanity: Assertion `rechist->rh_n_used == n_elems' failed. Debug print: Added 'rechist_dump' for ease of debugging, marked as unused. Useful for calling from gdb or adding to code temporarily. rechist_test_sanity: Make it more robust to bad rechists by limiting how many list items it will follow, to prevent infinite loops or walking off the end of the list. * rechist: Fix bug in lsquic_rechist_received causing circular list to be created Fix bug in lsquic_rechist_received demonstrated by the test6 test-case. When the list is empty, i.e. rh_n_used == 0, the 'first_elem' path should be used. However, the test for this was using rh_n_alloced, which would cause the code to continue on incorrectly. One possibility is that it goes to insert_before and creates a circular list in the rechist with the head at index 0 having a next of 0. This causes history to be lost I think. The list at this point is still 'empty', however a following call could go to the insert_before path and then insert an elem pointing to the circular list, and bump up rh_n_used. Now you have a circular list. Weird things can happen now. Notably, ACK generation will exhaust the packet buffer and generate an error, and so cause connections to be prematurely aborted. Fix lsquic_rechist_received to use rh_n_used. Also modify rechist_alloc_elem to NULL the next pointer for robustness. It would be nice for rechist_free_elem to also invalidate the elem, but it is meant for relinking elems in the list and should preserve the next pointer. |
||
---|---|---|
.. | ||
CMakeLists.txt | ||
graph_cubic.c | ||
mini_parse.c | ||
test_ack.c | ||
test_ack_merge.c | ||
test_ackgen_gquic_be.c | ||
test_ackgen_gquic_le.c | ||
test_ackparse_gquic_be.c | ||
test_ackparse_gquic_le.c | ||
test_ackparse_ietf.c | ||
test_alarmset.c | ||
test_alt_svc_ver.c | ||
test_arr.c | ||
test_attq.c | ||
test_blocked_gquic_be.c | ||
test_blocked_gquic_le.c | ||
test_bw_sampler.c | ||
test_chlo_gen.c | ||
test_clear_aead.c | ||
test_conn_close_gquic_be.c | ||
test_conn_close_gquic_le.c | ||
test_conn_hash.c | ||
test_crypto_gen.c | ||
test_cubic.c | ||
test_dec.c | ||
test_di_nocopy.c | ||
test_elision.c | ||
test_engine_ctor.c | ||
test_export_key.c | ||
test_frame_chop.c | ||
test_frame_reader.c | ||
test_frame_rw.c | ||
test_frame_writer.c | ||
test_goaway_gquic_be.c | ||
test_goaway_gquic_le.c | ||
test_h3_framing.c | ||
test_hcsi_reader.c | ||
test_hkdf.c | ||
test_hpi.c | ||
test_lsquic_hash.c | ||
test_malo.c | ||
test_min_heap.c | ||
test_minmax.c | ||
test_packet_out.c | ||
test_packet_resize.c | ||
test_packno_len.c | ||
test_parse_packet_in.c | ||
test_purga.c | ||
test_qlog.c | ||
test_quic_be_floats.c | ||
test_quic_le_floats.c | ||
test_rechist.c | ||
test_reg_pkt_headergen.c | ||
test_rst_stream_gquic_be.c | ||
test_rst_stream_gquic_le.c | ||
test_rst_stream_ietf.c | ||
test_rtt.c | ||
test_send_headers.c | ||
test_senhist.c | ||
test_set.c | ||
test_sfcw.c | ||
test_shi.c | ||
test_some_packets.c | ||
test_spi.c | ||
test_stop_waiting_gquic_be.c | ||
test_stop_waiting_gquic_le.c | ||
test_stream.c | ||
test_streamgen.c | ||
test_streamparse.c | ||
test_tokgen.c | ||
test_trapa.c | ||
test_trechist.c | ||
test_varint.c | ||
test_ver_nego.c | ||
test_wuf_gquic_be.c | ||
test_wuf_gquic_le.c |