summaryrefslogtreecommitdiffstats
path: root/src/network/access
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-12-19 14:22:37 +0100
committerMarc Mutz <marc.mutz@qt.io>2023-12-20 14:33:49 +0100
commit1e6bb61af3ae29755f93b92f157df026f934ae61 (patch)
tree4b09161b0602f5de06e3ce1916daaa92d3107c88 /src/network/access
parent99eaae4323ff1fda2d8cc0184d824b6d9c3f23ad (diff)
Http2: fix potential overflow in assemble_hpack_block()
The function is given a vector of Http2::Frame's and flattens it into a vector<uchar>. While each Frame can contain a maximum of 16GiB of data (24-bit size field), one "only" needs 257 of them to overflow the quint32 variable's range. So make sure any overflow does not go undetected. Keep the limited uint32_t range for now, as we don't know whether all consumers of the result can deal with more than 4GiB of data. Since all these frames must be in memory, this cannot overflow in practice on 32-bit machines. Pick-to: 6.7 6.6 6.5 6.2 5.15 Change-Id: Iafaa7d1c870cba9100e75065db11d95934f86213 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/network/access')
-rw-r--r--src/network/access/qhttp2protocolhandler.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp
index 464c658193..d159a1f885 100644
--- a/src/network/access/qhttp2protocolhandler.cpp
+++ b/src/network/access/qhttp2protocolhandler.cpp
@@ -10,10 +10,12 @@
#include <private/qnoncontiguousbytedevice_p.h>
#include <QtNetwork/qabstractsocket.h>
+
#include <QtCore/qloggingcategory.h>
#include <QtCore/qendian.h>
#include <QtCore/qdebug.h>
#include <QtCore/qlist.h>
+#include <QtCore/qnumeric.h>
#include <QtCore/qurl.h>
#include <qhttp2configuration.h>
@@ -91,8 +93,10 @@ std::vector<uchar> assemble_hpack_block(const std::vector<Http2::Frame> &frames)
std::vector<uchar> hpackBlock;
quint32 total = 0;
- for (const auto &frame : frames)
- total += frame.hpackBlockSize();
+ for (const auto &frame : frames) {
+ if (qAddOverflow(total, frame.hpackBlockSize(), &total))
+ return hpackBlock;
+ }
if (!total)
return hpackBlock;