From 817800ad39df10ca78e2c965a61d4d2025df622b Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 22 Dec 2014 21:19:27 -0200 Subject: Fix QXmlStreamReader parsing of files containing NULs Due to a flaw in the internal API, QXmlStreamReader's internal buffering would mistake a NUL byte in the input stream for EOF during parsing, but wouldn't set atEnd == true because it hadn't yet processed all bytes. This resulted in an infinite loop in QXmlStreamReaderPrivate::parse. So, instead of returning zero (false) to indicate EOF, return -1 (but in unsigned form, ~0, to avoid ICC warnings of change of sign). In turn, this required enlarging a few variables to avoid ~0U becoming 0xffff, which is a valid QChar (could happen if the input is a QString, not a QIODevice). Task-number: QTBUG-43513 Change-Id: If5badcfd3e4176b79517da1fd108e0abb93a3fd1 Reviewed-by: Lars Knoll Reviewed-by: Oswald Buddenhagen --- .../corelib/xml/qxmlstream/data/carriagereturn+nul.ref | 3 +++ .../corelib/xml/qxmlstream/data/carriagereturn+nul.xml | Bin 0 -> 60 bytes tests/auto/corelib/xml/qxmlstream/data/nul0.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul0.xml | Bin 0 -> 1 bytes tests/auto/corelib/xml/qxmlstream/data/nul1.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul1.xml | Bin 0 -> 3 bytes tests/auto/corelib/xml/qxmlstream/data/nul2.ref | 3 +++ tests/auto/corelib/xml/qxmlstream/data/nul2.xml | Bin 0 -> 4 bytes tests/auto/corelib/xml/qxmlstream/data/nul3.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul3.xml | Bin 0 -> 7 bytes tests/auto/corelib/xml/qxmlstream/data/nul3bis.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul3bis.xml | Bin 0 -> 9 bytes tests/auto/corelib/xml/qxmlstream/data/nul4.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul4.xml | Bin 0 -> 8 bytes tests/auto/corelib/xml/qxmlstream/data/nul4bis.ref | 2 ++ tests/auto/corelib/xml/qxmlstream/data/nul4bis.xml | Bin 0 -> 10 bytes tests/auto/corelib/xml/qxmlstream/data/nul5.ref | 3 +++ tests/auto/corelib/xml/qxmlstream/data/nul5.xml | Bin 0 -> 23 bytes 18 files changed, 21 insertions(+) create mode 100644 tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul0.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul0.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul1.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul1.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul2.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul2.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul3.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul3.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul3bis.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul3bis.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul4.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul4.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul4bis.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul4bis.xml create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul5.ref create mode 100644 tests/auto/corelib/xml/qxmlstream/data/nul5.xml (limited to 'tests/auto') diff --git a/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.ref b/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.ref new file mode 100644 index 0000000000..b636d80294 --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.ref @@ -0,0 +1,3 @@ +StartDocument( ) +Invalid( processingInstructionTarget="xml_" ) +ERROR: Invalid XML character. diff --git a/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.xml b/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.xml new file mode 100644 index 0000000000..e87bf56453 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/carriagereturn+nul.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul0.ref b/tests/auto/corelib/xml/qxmlstream/data/nul0.ref new file mode 100644 index 0000000000..a76455ee07 --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul0.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Premature end of document. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul0.xml b/tests/auto/corelib/xml/qxmlstream/data/nul0.xml new file mode 100644 index 0000000000..f76dd238ad Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul0.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul1.ref b/tests/auto/corelib/xml/qxmlstream/data/nul1.ref new file mode 100644 index 0000000000..a76455ee07 --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul1.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Premature end of document. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul1.xml b/tests/auto/corelib/xml/qxmlstream/data/nul1.xml new file mode 100644 index 0000000000..aab3ad6ca9 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul1.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul2.ref b/tests/auto/corelib/xml/qxmlstream/data/nul2.ref new file mode 100644 index 0000000000..08bbcc6aa4 --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul2.ref @@ -0,0 +1,3 @@ +StartDocument( ) +Invalid( ) +ERROR: Expected '[a-zA-Z]', but got ' '. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul2.xml b/tests/auto/corelib/xml/qxmlstream/data/nul2.xml new file mode 100644 index 0000000000..e14d1b8ae5 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul2.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul3.ref b/tests/auto/corelib/xml/qxmlstream/data/nul3.ref new file mode 100644 index 0000000000..cf4dd3848b --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul3.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Expected 'version', but got ''. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul3.xml b/tests/auto/corelib/xml/qxmlstream/data/nul3.xml new file mode 100644 index 0000000000..d8260b908e Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul3.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul3bis.ref b/tests/auto/corelib/xml/qxmlstream/data/nul3bis.ref new file mode 100644 index 0000000000..cf4dd3848b --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul3bis.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Expected 'version', but got ''. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul3bis.xml b/tests/auto/corelib/xml/qxmlstream/data/nul3bis.xml new file mode 100644 index 0000000000..61e011014e Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul3bis.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul4.ref b/tests/auto/corelib/xml/qxmlstream/data/nul4.ref new file mode 100644 index 0000000000..cf4dd3848b --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul4.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Expected 'version', but got ''. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul4.xml b/tests/auto/corelib/xml/qxmlstream/data/nul4.xml new file mode 100644 index 0000000000..90f20eebf0 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul4.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul4bis.ref b/tests/auto/corelib/xml/qxmlstream/data/nul4bis.ref new file mode 100644 index 0000000000..cf4dd3848b --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul4bis.ref @@ -0,0 +1,2 @@ +Invalid( ) +ERROR: Expected 'version', but got ''. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul4bis.xml b/tests/auto/corelib/xml/qxmlstream/data/nul4bis.xml new file mode 100644 index 0000000000..15d2d10685 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul4bis.xml differ diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul5.ref b/tests/auto/corelib/xml/qxmlstream/data/nul5.ref new file mode 100644 index 0000000000..9432b74a99 --- /dev/null +++ b/tests/auto/corelib/xml/qxmlstream/data/nul5.ref @@ -0,0 +1,3 @@ +StartDocument( documentVersion="1.0" ) +Invalid( ) +ERROR: Start tag expected. diff --git a/tests/auto/corelib/xml/qxmlstream/data/nul5.xml b/tests/auto/corelib/xml/qxmlstream/data/nul5.xml new file mode 100644 index 0000000000..6a79cbdc75 Binary files /dev/null and b/tests/auto/corelib/xml/qxmlstream/data/nul5.xml differ -- cgit v1.2.3