Hi Sami,
Thank you for your patches.
Some ideas will be used directly in commits.
For HTTP/2: this protocol is not yet completely implemented, and it
needs larger finishing, not just local band-aids. However, I'll try to
use some of your patches for HTTP/2 as well.
Best,
Evgeny
On 26/10/2026 19:42, Sami Jawhar wrote:
Patches 1 and 2 were found with UndefinedBehaviorSanitizer and the
OSS-Fuzz harnesses, the others by code reading:
1. Status codes above 511 were undefined behaviour in C++.
2. Three parameters that accept size zero were declared as VLAs.
3. HTTP/2 requests with empty or undefined pseudo-headers were served.
4. A first SETTINGS frame with one setting was ignored.
5. WINDOW_UPDATE added the stream id instead of the increment.
6. Dead code in process_inc_frame().
7. The client's SETTINGS acknowledgement stalled the connection.
8. The field iterator reported the value length as the name length.
9. The TLS session query returned an error on success.
Patches 3, 5 and 7-9 add or extend tests that fail without their fix.
The first window case of patch 5 also fails without patch 4. make check
shows no new failure at any patch.
Question: req_headers_preprocess() accepts an HTTP/2 request with no
:authority and an empty host header. Is that intended?
Sami Jawhar (9):
microhttpd2.h: added sentinel to enum MHD_HTTP_StatusCode
Removed array size from parameters that can be zero-sized
HTTP/2: added checks for invalid pseudo-headers
HTTP/2: fixed ignoring of a SETTINGS frame with one setting
HTTP/2: fixed stream window increment
HTTP/2: removed unreachable return and unused enum
HTTP/2: added processing of the settings acknowledgement
HTTP/2: fixed name length of request fields in iterator
Fixed status code of the TLS session connection info
doc/manual/responses.inc | 4 +-
src/include/microhttpd2.h | 19 +-
src/include/microhttpd2_main.h.in | 16 +-
src/include/microhttpd2_preamble.h.in | 3 +-
src/mhd2/conn_get_info.c | 2 +-
src/mhd2/h2/h2_conn_streams.c | 4 +-
src/mhd2/h2/h2_conn_streams.h | 2 +
src/mhd2/h2/h2_proc_in.c | 13 +-
src/mhd2/h2/h2_proc_settings.c | 11 +-
src/mhd2/h2/h2_proc_settings.h | 8 +
src/mhd2/h2/h2_req_fields.c | 6 +
src/mhd2/h2/h2_req_get_items.c | 2 +-
src/mhd2/response_from.c | 11 +-
src/mhd2/stream_process_request.c | 2 +-
src/mhd2/stream_process_request.h | 2 +-
src/tests/client_server/libtest.h | 30 +-
.../libtest_convenience_server_reply.c | 104 ++
src/tests/client_server/test_tls.c | 9 +
src/tests/raw/Makefile.am | 5 +
src/tests/raw/test_h2_raw.c | 1082 +++++++++++++++++
20 files changed, 1304 insertions(+), 31 deletions(-)
create mode 100644 src/tests/raw/test_h2_raw.c
base-commit: 24a2913c4e1cb31a5cff52047beae146959d50b0