0012-QXmlStreamReader-change-fastScanName-to-take-a-Value.patch 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. From 4a19ee001b0a80318860af4bc042382c7ffb6bbb Mon Sep 17 00:00:00 2001
  2. From: Ahmad Samir <a.samirh78@gmail.com>
  3. Date: Wed, 12 Apr 2023 13:10:26 +0200
  4. Subject: [PATCH] QXmlStreamReader: change fastScanName() to take a Value*
  5. For easier debugging, e.g. to print out value.len and value.prefix.
  6. Pick-to: 6.6 6.5 6.5.2 6.2 5.15
  7. Change-Id: Ib0eed38772f899502962f578775d34ea2744fdde
  8. Reviewed-by: Marc Mutz <marc.mutz@qt.io>
  9. Upstream: https://github.com/qt/qtbase/commit/1a423ce4372d18a779f3c0d746d5283d9a425839
  10. [Thomas: needed to fix
  11. https://security-tracker.debian.org/tracker/CVE-2023-37369]
  12. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  13. ---
  14. src/corelib/serialization/qxmlstream.cpp | 16 ++++++++--------
  15. src/corelib/serialization/qxmlstream.g | 3 ++-
  16. src/corelib/serialization/qxmlstream_p.h | 2 +-
  17. src/corelib/serialization/qxmlstreamparser_p.h | 3 ++-
  18. 4 files changed, 13 insertions(+), 11 deletions(-)
  19. diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp
  20. index ac5b291c278..466f456ee63 100644
  21. --- a/src/corelib/serialization/qxmlstream.cpp
  22. +++ b/src/corelib/serialization/qxmlstream.cpp
  23. @@ -1247,7 +1247,7 @@ inline qsizetype QXmlStreamReaderPrivate::fastScanContentCharList()
  24. return n;
  25. }
  26. -inline qsizetype QXmlStreamReaderPrivate::fastScanName(qint16 *prefix)
  27. +inline qsizetype QXmlStreamReaderPrivate::fastScanName(Value *val)
  28. {
  29. qsizetype n = 0;
  30. uint c;
  31. @@ -1284,16 +1284,16 @@ inline qsizetype QXmlStreamReaderPrivate::fastScanName(qint16 *prefix)
  32. case '+':
  33. case '*':
  34. putChar(c);
  35. - if (prefix && *prefix == n+1) {
  36. - *prefix = 0;
  37. + if (val && val->prefix == n + 1) {
  38. + val->prefix = 0;
  39. putChar(':');
  40. --n;
  41. }
  42. return n;
  43. case ':':
  44. - if (prefix) {
  45. - if (*prefix == 0) {
  46. - *prefix = qint16(n + 2);
  47. + if (val) {
  48. + if (val->prefix == 0) {
  49. + val->prefix = qint16(n + 2);
  50. } else { // only one colon allowed according to the namespace spec.
  51. putChar(c);
  52. return n;
  53. @@ -1309,8 +1309,8 @@ inline qsizetype QXmlStreamReaderPrivate::fastScanName(qint16 *prefix)
  54. }
  55. }
  56. - if (prefix)
  57. - *prefix = 0;
  58. + if (val)
  59. + val->prefix = 0;
  60. qsizetype pos = textBuffer.size() - n;
  61. putString(textBuffer, pos);
  62. textBuffer.resize(pos);
  63. diff --git a/src/corelib/serialization/qxmlstream.g b/src/corelib/serialization/qxmlstream.g
  64. index d06c371eb87..f3152bff378 100644
  65. --- a/src/corelib/serialization/qxmlstream.g
  66. +++ b/src/corelib/serialization/qxmlstream.g
  67. @@ -1419,7 +1419,8 @@ space_opt ::= space;
  68. qname ::= LETTER;
  69. /.
  70. case $rule_number: {
  71. - sym(1).len += fastScanName(&sym(1).prefix);
  72. + Value &val = sym(1);
  73. + val.len += fastScanName(&val);
  74. if (atEnd) {
  75. resume($rule_number);
  76. return false;
  77. diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h
  78. index f5059f8fcf9..efee742963b 100644
  79. --- a/src/corelib/serialization/qxmlstream_p.h
  80. +++ b/src/corelib/serialization/qxmlstream_p.h
  81. @@ -482,7 +482,7 @@ public:
  82. qsizetype fastScanLiteralContent();
  83. qsizetype fastScanSpace();
  84. qsizetype fastScanContentCharList();
  85. - qsizetype fastScanName(qint16 *prefix = nullptr);
  86. + qsizetype fastScanName(Value *val = nullptr);
  87. inline qsizetype fastScanNMTOKEN();
  88. diff --git a/src/corelib/serialization/qxmlstreamparser_p.h b/src/corelib/serialization/qxmlstreamparser_p.h
  89. index e3ae6faa442..59370a93106 100644
  90. --- a/src/corelib/serialization/qxmlstreamparser_p.h
  91. +++ b/src/corelib/serialization/qxmlstreamparser_p.h
  92. @@ -947,7 +947,8 @@ bool QXmlStreamReaderPrivate::parse()
  93. break;
  94. case 262: {
  95. - sym(1).len += fastScanName(&sym(1).prefix);
  96. + Value &val = sym(1);
  97. + val.len += fastScanName(&val);
  98. if (atEnd) {
  99. resume(262);
  100. return false;
  101. --
  102. 2.46.0