0011-HPack-fix-incorrect-integer-overflow-check.patch 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. From 01348087ee851f1781a27e7ce8a1ed0bda5441fe Mon Sep 17 00:00:00 2001
  2. From: Marc Mutz <marc.mutz@qt.io>
  3. Date: Tue, 12 Dec 2023 22:08:07 +0100
  4. Subject: [PATCH] HPack: fix incorrect integer overflow check
  5. This code never worked:
  6. For the comparison with max() - 32 to trigger, on 32-bit platforms (or
  7. Qt 5) signed interger overflow would have had to happen in the
  8. addition of the two sizes. The compiler can therefore remove the
  9. overflow check as dead code.
  10. On Qt 6 and 64-bit platforms, the signed integer addition would be
  11. very unlikely to overflow, but the following truncation to uint32
  12. would yield the correct result only in a narrow 32-value window just
  13. below UINT_MAX, if even that.
  14. Fix by using the proper tool, qAddOverflow.
  15. Pick-to: 6.7 6.6 6.5 6.2 5.15
  16. Change-Id: I7599f2e75ff7f488077b0c60b81022591005661c
  17. Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
  18. Fixes: https://security-tracker.debian.org/tracker/CVE-2023-51714
  19. Upstream: https://github.com/qt/qtbase/commit/ee5da1f2eaf8932aeca02ffea6e4c618585e29e3
  20. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  21. ---
  22. src/network/access/http2/hpacktable.cpp | 4 +++-
  23. 1 file changed, 3 insertions(+), 1 deletion(-)
  24. diff --git a/src/network/access/http2/hpacktable.cpp b/src/network/access/http2/hpacktable.cpp
  25. index 34da5594e2b..f20ec92d4c5 100644
  26. --- a/src/network/access/http2/hpacktable.cpp
  27. +++ b/src/network/access/http2/hpacktable.cpp
  28. @@ -26,7 +26,9 @@ HeaderSize entry_size(QByteArrayView name, QByteArrayView value)
  29. // for counting the number of references to the name and value would have
  30. // 32 octets of overhead."
  31. - const unsigned sum = unsigned(name.size() + value.size());
  32. + size_t sum;
  33. + if (qAddOverflow(size_t(name.size()), size_t(value.size()), &sum))
  34. + return HeaderSize();
  35. if (sum > (std::numeric_limits<unsigned>::max() - 32))
  36. return HeaderSize();
  37. return HeaderSize(true, quint32(sum + 32));
  38. --
  39. 2.46.0