summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-08-04 12:37:30 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-08-04 11:09:06 +0000
commit428a1da60b88415e7db21353a42bed85b8b76ed9 (patch)
treec6a062a53a79b40fff4ab4c4b00e7da20053f372 /writerfilter
parent24d19042644f5a49c8ae148a5021a98bee860066 (diff)
tdf#78506 RTF import: fix handling of invalid \levelnumbers
In case ';' is written in \u form in \levelnumbers, then Word ignores the whole \levelnumbers contents, do the same. Change-Id: I93ce5810af2b5ed703e804199c0b236d2c4c36b5 Reviewed-on: https://gerrit.libreoffice.org/27869 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdispatchvalue.cxx3
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx20
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx2
3 files changed, 23 insertions, 2 deletions
diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
index efd71cba54c0..30621f9afeeb 100644
--- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx
+++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx
@@ -628,6 +628,9 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
{
if (nParam != ';')
m_aStates.top().aLevelNumbers.push_back(sal_Int32(nParam));
+ else
+ // ';' in \u form is not considered valid.
+ m_aStates.top().bLevelNumbersValid = false;
}
else
m_aUnicodeBuffer.append(static_cast<sal_Unicode>(nParam));
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 909dc8643fc5..578751e85dfd 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -2007,11 +2007,16 @@ RTFError RTFDocumentImpl::popState()
}
break;
case Destination::LEVELNUMBERS:
- if (aState.aTableSprms.find(NS_ooxml::LN_CT_Lvl_lvlText))
+ {
+ bool bNestedLevelNumbers = false;
+ if (m_aStates.size() > 1)
+ // Current destination is levelnumbers and parent destination is levelnumbers as well.
+ bNestedLevelNumbers = m_aStates[m_aStates.size() - 2].eDestination == Destination::LEVELNUMBERS;
+ if (!bNestedLevelNumbers && aState.aTableSprms.find(NS_ooxml::LN_CT_Lvl_lvlText))
{
RTFSprms& rAttributes = aState.aTableSprms.find(NS_ooxml::LN_CT_Lvl_lvlText)->getAttributes();
RTFValue::Pointer_t pValue = rAttributes.find(NS_ooxml::LN_CT_LevelText_val);
- if (pValue)
+ if (pValue && aState.bLevelNumbersValid)
{
OUString aOrig = pValue->getString();
@@ -2032,8 +2037,12 @@ RTFError RTFDocumentImpl::popState()
pValue->setString(aBuf.makeStringAndClear());
}
+ else if (pValue)
+ // Have a value, but levelnumbers is not valid -> ignore it.
+ pValue->setString(OUString());
}
break;
+ }
case Destination::SHAPEPROPERTYNAME:
if (&m_aStates.top().aDestinationText != m_aStates.top().pDestinationText)
break; // not for nested group
@@ -2914,7 +2923,13 @@ RTFError RTFDocumentImpl::popState()
break;
case Destination::LEVELNUMBERS:
if (!m_aStates.empty())
+ {
m_aStates.top().aTableSprms = aState.aTableSprms;
+ if (aState.eDestination == Destination::LEVELNUMBERS)
+ // Both current and parent state is levelnumbers: mark parent
+ // as invalid as well if necessary.
+ m_aStates.top().bLevelNumbersValid = aState.bLevelNumbersValid;
+ }
break;
case Destination::FIELDINSTRUCTION:
if (!m_aStates.empty())
@@ -3171,6 +3186,7 @@ RTFParserState::RTFParserState(RTFDocumentImpl* pDocumentImpl)
nListLevelNum(0),
aListLevelEntries(),
aLevelNumbers(),
+ bLevelNumbersValid(true),
aPicture(),
aShape(),
aDrawingObject(),
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 83d205b87237..0c46d80935d7 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -258,6 +258,8 @@ public:
/// List of character positions in leveltext to replace.
std::vector<sal_Int32> aLevelNumbers;
+ /// If aLevelNumbers should be read at all.
+ bool bLevelNumbersValid;
RTFPicture aPicture;
RTFShape aShape;