HTTP2: delay any communication until encrypted() can be responded to
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Sat, 8 Feb 2025 16:24:33 +0000 (19:24 +0300)
committerDmitry Shachnev <mitya57@debian.org>
Sat, 8 Feb 2025 16:24:33 +0000 (19:24 +0300)
commit4b5242363aa8cbc6a2ca02b2e775f7dbc8a8cb28
tree7935c469e173cf1d0b9240744d728a829c68608a
parent445a948f868d12c686e7d58044559df9abf9f2bf
HTTP2: delay any communication until encrypted() can be responded to

Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=b1e75376cc3adfc7
Last-Update: 2024-07-14

We have the encrypted() signal that lets users do extra checks on the
established connection. It is emitted as BlockingQueued, so the HTTP
thread stalls until it is done emitting. Users can potentially call
abort() on the QNetworkReply at that point, which is passed as a Queued
call back to the HTTP thread. That means that any currently queued
signal emission will be processed before the abort() call is processed.

In the case of HTTP2 it is a little special since it is multiplexed and
the code is built to start requests as they are available. This means
that, while the code worked fine for HTTP1, since one connection only
has one request, it is not working for HTTP2, since we try to send more
requests in-between the encrypted() signal and the abort() call.

This patch changes the code to delay any communication until the
encrypted() signal has been emitted and processed, for HTTP2 only.
It's done by adding a few booleans, both to know that we have to return
early and so we can keep track of what events arose and what we need to
resume once enough time has passed that any abort() call must have been
processed.

Gbp-Pq: Name CVE-2024-39936.diff
src/network/access/qhttp2protocolhandler.cpp
src/network/access/qhttpnetworkconnectionchannel.cpp
src/network/access/qhttpnetworkconnectionchannel_p.h
tests/auto/network/access/http2/tst_http2.cpp