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>
This commit is contained in:
Aron Budea 2023-08-06 05:08:23 +02:00
parent db9fa6da9d
commit c9e8638015
2 changed files with 44 additions and 5 deletions

View file

@ -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

View file

@ -1264,12 +1264,14 @@ void FastSaxParserImpl::callbackStartElement(const xmlChar *localName , const xm
OUString aElementPrefix;
if( prefix != nullptr )
{
if ( !m_bIgnoreMissingNSDecl || URI != nullptr )
sNamespace = OUString( XML_CAST( URI ), strlen( XML_CAST( URI )), RTL_TEXTENCODING_UTF8 );
else
sNamespace.clear();
nNamespaceToken = GetNamespaceToken( sNamespace );
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 if ( m_bIgnoreMissingNSDecl )
sNamespace.clear();
else
throw SAXException("No namespace defined for " + aElementPrefix, {}, {});
nNamespaceToken = GetNamespaceToken( sNamespace );
}
OUString aElementLocalName( XML_CAST( localName ), strlen( XML_CAST( localName )), RTL_TEXTENCODING_UTF8 );
rEvent.msNamespace = sNamespace;