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
41 files changed
tree: eb438711e9b5c123a90d5947903eb5e196b8a125
  1. .circleci/
  2. .github/
  3. CMake/
  4. docs/
  5. include/
  6. lib/
  7. LICENSES/
  8. m4/
  9. packages/
  10. plan9/
  11. projects/
  12. scripts/
  13. src/
  14. tests/
  15. winbuild/
  16. .dir-locals.el
  17. .git-blame-ignore-revs
  18. .gitattributes
  19. .gitignore
  20. .mailmap
  21. acinclude.m4
  22. appveyor.sh
  23. appveyor.yml
  24. buildconf
  25. CHANGES.md
  26. CMakeLists.txt
  27. configure.ac
  28. COPYING
  29. curl-config.in
  30. Dockerfile
  31. GIT-INFO.md
  32. libcurl.pc.in
  33. Makefile.am
  34. README
  35. README.md
  36. RELEASE-NOTES
  37. renovate.json
  38. REUSE.toml
  39. SECURITY.md
README.md

curl logo

curl is a command-line tool for transferring data specified with URL syntax. Learn how to use curl by reading the manpage or everything curl.

Find out how to install curl by reading the INSTALL document.

libcurl is the library curl is using to do its job. It is readily available to be used by your software. Read the libcurl manpage to learn how.

Open Source

curl is Open Source and is distributed under an MIT-like license.

Contact

Contact us on a suitable mailing list or use GitHub issues/ pull requests/ discussions.

All contributors to the project are listed in the THANKS document.

Commercial support

For commercial support, maybe private and dedicated help with your problems or applications using (lib)curl visit the support page.

Website

Visit the curl website for the latest news and downloads.

Source code

Download the latest source from the Git server:

git clone https://github.com/curl/curl.git

Security problems

Report suspected security problems via our HackerOne page and not in public.

Notice

curl contains pieces of source code that is Copyright (c) 1998, 1999 Kungliga Tekniska Högskolan. This notice is included here to comply with the distribution terms.

Backers

Thank you to all our backers 🙏 Become a backer.

Sponsors

Support this project by becoming a sponsor.