multi: do transfer book keeping using mid

Change multi's book keeping of transfers to no longer use lists, but a
special table and bitsets for unsigned int values.

`multi-xfers` is the `uint_tbl` where `multi_add_handle()` inserts a new
transfer which assigns it a unique identifier `mid`. Use bitsets to keep
track of transfers that are in state "process" or "pending" or
"msgsent".

Use sparse bitsets to replace `conn->easyq` and event handlings tracking
of transfers per socket. Instead of pointers, keep the mids involved.

Provide base data structures and document them in docs/internal:
* `uint_tbl`: a table of transfers with `mid` as lookup key,
   handing out a mid for adds between 0 - capacity.
* `uint_bset`: a bitset keeping unsigned ints from 0 - capacity.
* `uint_spbset`: a sparse bitset for keeping a small number of
  unsigned int values
* `uint_hash`: for associating `mid`s with a pointer.

This makes the `mid` the recommended way to refer to transfers inside
the same multi without risk of running into a UAF.

Modifying table and bitsets is safe while iterating over them. Overall
memory requirements are lower as with the double linked list apprach.

Closes #16761
This commit is contained in:
Stefan Eissing 2025-03-25 09:47:40 +01:00 committed by Daniel Stenberg
parent 02e9690c3e
commit 909af1a43b
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
41 changed files with 2553 additions and 424 deletions

View file

@ -276,6 +276,6 @@ test3032 \
test3100 test3101 test3102 test3103 test3104 test3105 \
\
test3200 test3201 test3202 test3203 test3204 test3205 test3207 test3208 \
test3209 test3210
test3209 test3210 test3211 test3212 test3213
EXTRA_DIST = $(TESTCASES) DISABLED

22
tests/data/test3211 Normal file
View file

@ -0,0 +1,22 @@
<testcase>
<info>
<keywords>
unittest
uint_bset
</keywords>
</info>
#
# Client-side
<client>
<server>
none
</server>
<features>
unittest
</features>
<name>
uint_bset unit tests
</name>
</client>
</testcase>

22
tests/data/test3212 Normal file
View file

@ -0,0 +1,22 @@
<testcase>
<info>
<keywords>
unittest
uint_bset
</keywords>
</info>
#
# Client-side
<client>
<server>
none
</server>
<features>
unittest
</features>
<name>
uint_bset unit tests
</name>
</client>
</testcase>

22
tests/data/test3213 Normal file
View file

@ -0,0 +1,22 @@
<testcase>
<info>
<keywords>
unittest
uint_spbset
</keywords>
</info>
#
# Client-side
<client>
<server>
none
</server>
<features>
unittest
</features>
<name>
uint_spbset unit tests
</name>
</client>
</testcase>