From a0442972b3be427d2003e3b9ef9aa86c44c9e9be Mon Sep 17 00:00:00 2001 From: Ahmad Samir <a.samirh78@gmail.com> Date: Wed, 12 Apr 2023 13:10:26 +0200 Subject: [PATCH 099/147] QXmlStreamReader: change fastScanName() to take a Value* For easier debugging, e.g. to print out value.len and value.prefix. Pick-to: 6.6 6.5 6.5.2 6.2 5.15 Change-Id: Ib0eed38772f899502962f578775d34ea2744fdde Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit 1a423ce4372d18a779f3c0d746d5283d9a425839) * asturmlechner 2023-07-09: Fix apparently missing change in src/corelib/serialization/qxmlstream.g - it caused upstream CVE-2023-37369-qtbase-5.15.diff to fail to apply (besides missing this commit in the first place). --- src/corelib/serialization/qxmlstream.cpp | 16 ++++++++-------- src/corelib/serialization/qxmlstream.g | 5 +++-- src/corelib/serialization/qxmlstream_p.h | 5 +++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp index 0ac5548178..758cf9ba9b 100644 --- a/src/corelib/serialization/qxmlstream.cpp +++ b/src/corelib/serialization/qxmlstream.cpp @@ -1302,7 +1302,7 @@ inline int QXmlStreamReaderPrivate::fastScanContentCharList() return n; } -inline int QXmlStreamReaderPrivate::fastScanName(int *prefix) +inline int QXmlStreamReaderPrivate::fastScanName(Value *val) { int n = 0; uint c; @@ -1339,16 +1339,16 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix) case '+': case '*': putChar(c); - if (prefix && *prefix == n+1) { - *prefix = 0; + if (val && val->prefix == n + 1) { + val->prefix = 0; putChar(':'); --n; } return n; case ':': - if (prefix) { - if (*prefix == 0) { - *prefix = n+2; + if (val) { + if (val->prefix == 0) { + val->prefix = n + 2; } else { // only one colon allowed according to the namespace spec. putChar(c); return n; @@ -1364,8 +1364,8 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix) } } - if (prefix) - *prefix = 0; + if (val) + val->prefix = 0; int pos = textBuffer.size() - n; putString(textBuffer, pos); textBuffer.resize(pos); diff --git a/src/corelib/serialization/qxmlstream.g b/src/corelib/serialization/qxmlstream.g index 4321fed68a..83e18de6b0 100644 --- a/src/corelib/serialization/qxmlstream.g +++ b/src/corelib/serialization/qxmlstream.g @@ -516,7 +516,7 @@ public: int fastScanLiteralContent(); int fastScanSpace(); int fastScanContentCharList(); - int fastScanName(int *prefix = nullptr); + int fastScanName(Value *val = nullptr); inline int fastScanNMTOKEN(); @@ -1811,7 +1811,8 @@ space_opt ::= space; qname ::= LETTER; /. case $rule_number: { - sym(1).len += fastScanName(&sym(1).prefix); + Value &val = sym(1); + val.len += fastScanName(&val); if (atEnd) { resume($rule_number); return false; diff --git a/src/corelib/serialization/qxmlstream_p.h b/src/corelib/serialization/qxmlstream_p.h index e5bde7b98e..7c7dbb45dc 100644 --- a/src/corelib/serialization/qxmlstream_p.h +++ b/src/corelib/serialization/qxmlstream_p.h @@ -1005,7 +1005,7 @@ public: int fastScanLiteralContent(); int fastScanSpace(); int fastScanContentCharList(); - int fastScanName(int *prefix = nullptr); + int fastScanName(Value *val = nullptr); inline int fastScanNMTOKEN(); @@ -1939,7 +1939,8 @@ bool QXmlStreamReaderPrivate::parse() break; case 262: { - sym(1).len += fastScanName(&sym(1).prefix); + Value &val = sym(1); + val.len += fastScanName(&val); if (atEnd) { resume(262); return false; -- 2.40.1