summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAron Budea <aron.budea@collabora.com>2023-08-06 05:08:23 +0200
committerAron Budea <aron.budea@collabora.com>2023-08-07 17:38:30 +0200
commitc9e863801509fb37b125a8fb07358fb1b235496d (patch)
treea5fe10a3bb24845735b8293faaaa7cd0c5ee43f4
parentdb9fa6da9d57853e0089a063ec372e11ce6046a9 (diff)
tdf#150137 fastparser: don't crash on undeclared namespace
Change-Id: Icc8bbb391c7e34754b7274d67d73ff509827a3d0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155381 Tested-by: Aron Budea <aron.budea@collabora.com> Reviewed-by: Aron Budea <aron.budea@collabora.com>
-rw-r--r--basic/qa/basic_coverage/test_tdf150137_parse_fail.bas37
-rw-r--r--sax/source/fastparser/fastparser.cxx8
2 files changed, 42 insertions, 3 deletions
diff --git a/basic/qa/basic_coverage/test_tdf150137_parse_fail.bas b/basic/qa/basic_coverage/test_tdf150137_parse_fail.bas
new file mode 100644
index 000000000000..fdf9f1e9948e
--- /dev/null
+++ b/basic/qa/basic_coverage/test_tdf150137_parse_fail.bas
@@ -0,0 +1,37 @@
+'
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+'
+
+Option Explicit
+
+Function doUnitTest() As String
+ On Error GoTo ErrorHandler ' Set up error handler
+
+ Dim Xml As String
+ Dim XmlLen As Long
+ ' Not namespace-well-formed XML, parse is expected to fail
+ Xml = "<a:xml/>"
+ XmlLen = Len(Xml)
+ Dim XmlByte(1 To XmlLen) As Byte
+ Dim Index As Integer
+ For Index = 1 To XmlLen
+ XmlByte(Index) = Asc(Mid(Xml, Index, 1))
+ Next
+ Dim source As Object
+ source = CreateUnoStruct("com.sun.star.xml.sax.InputSource")
+ source.aInputStream = com.sun.star.io.SequenceInputStream.createStreamFromSequence(XmlByte)
+ Dim parser As Object
+ parser = CreateUnoService("com.sun.star.xml.sax.FastParser")
+ ' Parse crashed before the fix
+ parser.ParseStream(source)
+
+ ' Shouldn't end up here
+ doUnitTest = "FAIL"
+ Exit Function
+ErrorHandler:
+ doUnitTest = "OK"
+End Function
diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index fd1b147f044e..3c67010ad1cb 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -1264,12 +1264,14 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
OUString aElementPrefix;
if( prefix != nullptr )
{
- if ( !m_bIgnoreMissingNSDecl || URI != nullptr )
+ aElementPrefix = OUString( XML_CAST( prefix ), strlen( XML_CAST( prefix )), RTL_TEXTENCODING_UTF8 );
+ if ( URI != nullptr )
sNamespace = OUString( XML_CAST( URI ), strlen( XML_CAST( URI )), RTL_TEXTENCODING_UTF8 );
- else
+ else if ( m_bIgnoreMissingNSDecl )
sNamespace.clear();
+ else
+ throw SAXException("No namespace defined for " + aElementPrefix, {}, {});
nNamespaceToken = GetNamespaceToken( sNamespace );
- aElementPrefix = OUString( XML_CAST( prefix ), strlen( XML_CAST( prefix )), RTL_TEXTENCODING_UTF8 );
}
OUString aElementLocalName( XML_CAST( localName ), strlen( XML_CAST( localName )), RTL_TEXTENCODING_UTF8 );
rEvent.msNamespace = sNamespace;