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.5 6.2 5.15
Change-Id: Iafaa7d1c870cba9100e75065db11d95934f86213
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
(cherry picked from commit 1e6bb61af3ae29755f93b92f157df026f934ae61)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit af8a9874c32c6b1af8998be9487170b6269dbe1f)
This commit is contained in:
Marc Mutz 2023-12-19 14:22:37 +01:00 committed by Qt Cherry-pick Bot
parent 06618fbebe
commit 2e50fbc30a

View File

@ -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>
@ -90,8 +92,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;