summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-11-08 12:53:05 +0000
committerCaolán McNamara <caolanm@redhat.com>2018-11-08 18:09:43 +0100
commit8f5de14bece7548f44aafc32d3bb3d9d2211a389 (patch)
treee86fe6ef49b39ca7cd7e1616771f73295fcf3901
parentf0effa0e891d2bb64df6c5c70088938774db1f76 (diff)
Resolves: tdf#121200 better ofz#7802 infinite loop fix
Change-Id: I50163d6545782012b177a48a1aded0572499f9af Reviewed-on: https://gerrit.libreoffice.org/63097 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--editeng/source/rtf/svxrtf.cxx18
1 files changed, 17 insertions, 1 deletions
diff --git a/editeng/source/rtf/svxrtf.cxx b/editeng/source/rtf/svxrtf.cxx
index 6f8299e0716e..eed91b25158f 100644
--- a/editeng/source/rtf/svxrtf.cxx
+++ b/editeng/source/rtf/svxrtf.cxx
@@ -352,18 +352,34 @@ void SvxRTFParser::ReadStyleTable()
case RTF_CHRFMT:
case RTF_BRDRDEF:
case RTF_TABSTOPDEF:
-
+#ifndef NDEBUG
+ auto nEnteringToken = nToken;
+#endif
+ auto nEnteringIndex = m_nTokenIndex;
+ int nSkippedTokens = 0;
if( RTF_SWGDEFS & nToken)
{
if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
break;
nToken = SkipToken();
+ ++nSkippedTokens;
if( '{' == GetStackPtr( -1 )->nTokenId )
{
nToken = SkipToken();
+ ++nSkippedTokens;
}
}
ReadAttr( nToken, &pStyle->aAttrSet );
+ if (nSkippedTokens && m_nTokenIndex == nEnteringIndex - nSkippedTokens)
+ {
+ // we called SkipToken to go back one or two, but ReadAttrs
+ // read nothing, so on next loop of the outer while we
+ // would end up in the same state again (assert that)
+ assert(nEnteringToken == GetNextToken());
+ // and loop endlessly, skip format a token
+ // instead to avoid that
+ SkipToken(nSkippedTokens);
+ }
break;
}
break;