summaryrefslogtreecommitdiffstats
path: root/writerfilter
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2011-12-13 14:22:44 +0100
committerCédric Bosdonnat <cedric.bosdonnat.ooo@free.fr>2011-12-13 15:12:24 +0100
commite7fc2624a1aa4aaaf29fe302a30cc43a297106e5 (patch)
tree5ecadaae05571aa6b32652357ad067453e16cc18 /writerfilter
parentfdo#30714 move SID_INSERT_CURRENT_DATE/TIME to GID_INSERT (diff)
downloadcore-e7fc2624a1aa4aaaf29fe302a30cc43a297106e5.tar.gz
core-e7fc2624a1aa4aaaf29fe302a30cc43a297106e5.zip
n#703032: Fixed an RTF import crash when handling formdata in non-FORM fields
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx25
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx1
2 files changed, 22 insertions, 4 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 8b25e4eebfe2..2b6aa61afbfb 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -288,6 +288,7 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
m_aStyleTableEntries(),
m_nCurrentStyleIndex(0),
m_bEq(false),
+ m_bFormField(false),
m_bWasInFrame(false),
m_bIsInFrame(false),
m_aUnicodeBuffer()
@@ -969,18 +970,32 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
break;
case RTF_FLDINST:
{
+ // Look for the field type
sal_Int32 nPos = Strm().Tell();
OStringBuffer aBuf;
char ch;
- for (int i = 0; i < 4; ++i)
+ bool bFoundCode = false;
+ bool bInKeyword = false;
+ while (!bFoundCode && ch != '}')
{
Strm() >> ch;
- aBuf.append(ch);
+ if ('\\' == ch)
+ bInKeyword = true;
+ if (!bInKeyword && isalnum(ch))
+ aBuf.append(ch);
+ else if (bInKeyword && isspace(ch))
+ bInKeyword = false;
+ if (aBuf.getLength() > 0 && !isalnum(ch))
+ bFoundCode = true;
}
Strm().Seek(nPos);
+ // Form data should be handled only for form fields if any
+ if (aBuf.toString().indexOf(OString("FORM")) != -1 )
+ m_bFormField = true;
+
// EQ fields are not really fields in fact.
- if (aBuf.toString().equals("{ EQ"))
+ if (aBuf.toString().equals("EQ"))
m_bEq = true;
else
{
@@ -2871,7 +2886,7 @@ int RTFDocumentImpl::popState()
RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aDestinationText.makeStringAndClear()));
m_aFormfieldSprms->push_back(make_pair(NS_ooxml::LN_CT_FFDDList_listEntry, pValue));
}
- else if (m_aStates.top().nDestinationState == DESTINATION_DATAFIELD)
+ else if (m_aStates.top().nDestinationState == DESTINATION_DATAFIELD && m_bFormField)
{
OString aStr = OUStringToOString(m_aStates.top().aDestinationText.makeStringAndClear(), m_aStates.top().nCurrentEncoding);
// decode hex dump
@@ -2914,6 +2929,8 @@ int RTFDocumentImpl::popState()
m_aFormfieldSprms->push_back(make_pair(NS_ooxml::LN_CT_FFData_name, pNValue));
RTFValue::Pointer_t pDValue(new RTFValue(OStringToOUString(aDefaultText, m_aStates.top().nCurrentEncoding)));
m_aFormfieldSprms->push_back(make_pair(NS_ooxml::LN_CT_FFTextInput_default, pDValue));
+
+ m_bFormField = false;
}
else if (m_aStates.top().nDestinationState == DESTINATION_CREATIONTIME && m_xDocumentProperties.is())
m_xDocumentProperties->setCreationDate(lcl_getDateTime(m_aStates));
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 729e5e5c2670..4370d9a8c832 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -425,6 +425,7 @@ namespace writerfilter {
RTFReferenceTable::Entries_t m_aStyleTableEntries;
int m_nCurrentStyleIndex;
bool m_bEq;
+ bool m_bFormField;
/// If we were in a frame.
bool m_bWasInFrame;
/// If a frame start token is already sent to dmapper (nesting them is not OK).