diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-11-08 12:53:05 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-11-08 18:09:43 +0100 |
commit | 8f5de14bece7548f44aafc32d3bb3d9d2211a389 (patch) | |
tree | e86fe6ef49b39ca7cd7e1616771f73295fcf3901 /editeng | |
parent | f0effa0e891d2bb64df6c5c70088938774db1f76 (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>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/rtf/svxrtf.cxx | 18 |
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; |