summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-09-05 22:01:12 +0200
committerCaolán McNamara <caolanm@redhat.com>2017-09-07 11:52:11 +0200
commit97355ad2ba0dd9908b5ee5c05bc525c68753fe08 (patch)
tree3090c2493eed5a6f3beb109734cc49490118901f
parentffdbcb111c1713297ed890b0571907f3ac4142ae (diff)
tdf#112164 sax: handle errors on last call to XML_Parse()
If XML_Parse() is called with isFinal=1 and there are open tags, that is an error (XML_ERROR_NO_ELEMENTS) that must be converted to an exception. This reveals that we already had an incomplete input document, which needs to be moved to "fail" now. (cherry picked from commit e530a7ddb1c9423487ce936e6b23b8e36449d555) tdf#112164 add test document (cherry picked from commit aad2cdce2a2e89f35366c55878129d268cc92bef) Change-Id: I7ce3b51bd87923b5edde621508cf38d7ebbc2b14 Reviewed-on: https://gerrit.libreoffice.org/41963 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--sax/source/expatwrap/sax_expat.cxx15
-rw-r--r--sw/qa/core/data/odt/fail/c2dfc5bd-8366-40e7-b862-55e13fdc52dc.odtbin0 -> 2544 bytes
-rw-r--r--sw/qa/core/data/odt/fail/tdf102018.odt (renamed from sw/qa/core/data/odt/pass/tdf102018.odt)bin2851 -> 2851 bytes
3 files changed, 10 insertions, 5 deletions
diff --git a/sax/source/expatwrap/sax_expat.cxx b/sax/source/expatwrap/sax_expat.cxx
index 6747511840ed..9502e6749f64 100644
--- a/sax/source/expatwrap/sax_expat.cxx
+++ b/sax/source/expatwrap/sax_expat.cxx
@@ -647,18 +647,23 @@ void SaxExpatParser_Impl::parse( )
while( nRead ) {
nRead = getEntity().converter.readAndConvert( seqOut , nBufSize );
+ bool bContinue(false);
+
if( ! nRead ) {
- XML_Parse( getEntity().pParser ,
+ // last call - must return OK
+ XML_Status const ret = XML_Parse( getEntity().pParser,
reinterpret_cast<const char *>(seqOut.getConstArray()),
0 ,
1 );
- break;
- }
-
- bool bContinue = ( XML_Parse( getEntity().pParser ,
+ if (ret == XML_STATUS_OK) {
+ break;
+ }
+ } else {
+ bContinue = ( XML_Parse( getEntity().pParser,
reinterpret_cast<const char *>(seqOut.getConstArray()),
nRead,
0 ) != XML_STATUS_ERROR );
+ }
if( ! bContinue || this->bExceptionWasThrown ) {
diff --git a/sw/qa/core/data/odt/fail/c2dfc5bd-8366-40e7-b862-55e13fdc52dc.odt b/sw/qa/core/data/odt/fail/c2dfc5bd-8366-40e7-b862-55e13fdc52dc.odt
new file mode 100644
index 000000000000..7cafa8d5e19b
--- /dev/null
+++ b/sw/qa/core/data/odt/fail/c2dfc5bd-8366-40e7-b862-55e13fdc52dc.odt
Binary files differ
diff --git a/sw/qa/core/data/odt/pass/tdf102018.odt b/sw/qa/core/data/odt/fail/tdf102018.odt
index d804aec11df0..d804aec11df0 100644
--- a/sw/qa/core/data/odt/pass/tdf102018.odt
+++ b/sw/qa/core/data/odt/fail/tdf102018.odt
Binary files differ