summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2013-11-28 13:35:27 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-01-27 03:10:16 +0000
commite7debed56f5f037208e49233034ad8a578d1dfbc (patch)
treecde251e8f3c7276deae9cd7b29923bc3c5c7d58e /writerfilter
parentc6020d169c857d4250f966150f2d48d0735e2c75 (diff)
fdo#66011 abi#2128 RTF import: fix memory leak
Commit 9389cf78e304a5a99bcf1745b9388e14ac36281a (cp#1000018 RTF import: empty para at the end of footnote text got lost, 2013-11-15) assumed that \par at the end of all substreams means an empty paragraph, but it turns out this is only true for footnotes/endnotes, but not for e.g. headers. Additionally, that commit actually causes a memory leak, which is detected by an assert in the SwIndexReg dtor, so crash-testing caught this. (cherry picked from commit f7ef84640258e4ee6ddc4cc5cbf58a2d89860afa) Change-Id: Idfa040bf3026a9515a120cd7afaf7d314553a131 Reviewed-on: https://gerrit.libreoffice.org/7663 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx11
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.hxx3
2 files changed, 13 insertions, 1 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 72f2c8cc55d0..7f3e25353665 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -252,6 +252,7 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x
m_aSuperBuffer(),
m_bHasFootnote(false),
m_pSuperstream(0),
+ m_nStreamType(0),
m_nHeaderFooterPositions(),
m_nGroupStartPos(0),
m_aBookmarks(),
@@ -313,6 +314,11 @@ void RTFDocumentImpl::setSuperstream(RTFDocumentImpl *pSuperstream)
m_pSuperstream = pSuperstream;
}
+void RTFDocumentImpl::setStreamType(Id nId)
+{
+ m_nStreamType = nId;
+}
+
void RTFDocumentImpl::setAuthor(OUString& rAuthor)
{
m_aAuthor = rAuthor;
@@ -349,6 +355,7 @@ void RTFDocumentImpl::resolveSubstream(sal_uInt32 nPos, Id nId, OUString& rIgnor
// Seek to header position, parse, then seek back.
RTFDocumentImpl::Pointer_t pImpl(new RTFDocumentImpl(m_xContext, m_xInputStream, m_xDstDoc, m_xFrame, m_xStatusIndicator));
pImpl->setSuperstream(this);
+ pImpl->setStreamType(nId);
pImpl->setIgnoreFirst(rIgnoreFirst);
if (!m_aAuthor.isEmpty())
{
@@ -4523,7 +4530,9 @@ int RTFDocumentImpl::popState()
// This is the end of the doc, see if we need to close the last section.
if (m_pTokenizer->getGroup() == 1 && !m_bFirstRun)
{
- if (m_bNeedCr && !isSubstream())
+ // \par means an empty paragraph at the end of footnotes/endnotes, but
+ // not in case of other substreams, like headers.
+ if (m_bNeedCr && !(m_nStreamType == NS_rtf::LN_footnote || m_nStreamType == NS_rtf::LN_endnote))
dispatchSymbol(RTF_PAR);
sectBreak(true);
}
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index a0b1076f3a03..eada5faf0092 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -313,6 +313,7 @@ namespace writerfilter {
Stream& Mapper();
void setSubstream(bool bIsSubtream);
void setSuperstream(RTFDocumentImpl *pSuperstream);
+ void setStreamType(Id nId);
void setAuthor(OUString& rAuthor);
void setAuthorInitials(OUString& rAuthorInitials);
void setIgnoreFirst(OUString& rIgnoreFirst);
@@ -413,6 +414,8 @@ namespace writerfilter {
bool m_bHasFootnote;
/// Superstream of this substream.
RTFDocumentImpl *m_pSuperstream;
+ /// Type of the stream: header, footer, footnote, etc.
+ Id m_nStreamType;
std::queue< std::pair<Id, sal_uInt32> > m_nHeaderFooterPositions;
sal_uInt32 m_nGroupStartPos;
/// Ignore the first occurrence of this text.