(Please keep me on CC as I am not subscribed to the list)
Hi all,
I have been building LibreOffice using Clang on Mac OS X Lion again, now
that it is possible to get a working build using Clang on Linux.
During the build, however, the "sw_filters_test" unit test crashes. The
crash happens in rtl_string_release from the FieldEntry (the one in
sw/source/file/ww8/ww8par.hxx) destructor. The FieldEntry destructor is
called through a dyld stub.
After reading assembly code I figured that the FieldEntry destructor
being executed does not match the FieldEntry's fields. What was already
suspicious above is that rtl_string_release is being called even though
this FieldEntry uses OUStrings.
From the assembly code I guess the FieldEntry destructor being executed
is actually the one in registry/source/reflwrit.cxx. So my impression
is that the dynamic linker on OS X is simply calling the wrong
destructor (the symbols have the same name).
To fix this, I can think of either putting the WW8 FieldEntry in a
namespace, or renaming it to WW8FieldEntry. Since no namespaces were
used in the current code, I decided to rename the class.
A patch is attached and I verified that it fixes the crashing unit test
for me. If people have a better or preferred way to fix this, please let
me know and I will update the patch accordingly.
regards,
-kris.
From 1bfb0a0d984b955fe5df9fd6fa898c985aea305b Mon Sep 17 00:00:00 2001
From: Kristian Rietveld <kris@lanedo.com>
Date: Sun, 22 Jul 2012 11:19:28 +0200
Subject: [PATCH] Rename FieldEntry to WW8FieldEntry
When compiled with Clang on OS X, the OS X dynamic linker appears to be
confused about which FieldEntry destructor to call at runtime. In some
cases, the FieldEntry destructor in register/source/reflwrit.cxx is
called instead (both destructors have the same symbol name). This patch
avoids this problem.
Change-Id: I7d69894318cb8fda0a7c5a9b1c2ff3ca0d47a37c
---
sw/source/filter/ww8/ww8par.hxx | 16 ++++++++--------
sw/source/filter/ww8/ww8par5.cxx | 26 +++++++++++++-------------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index dde6d15..9215369 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -456,7 +456,7 @@ namespace sw
}
}
-class FieldEntry
+class WW8FieldEntry
{
private:
::rtl::OUString msBookmarkName;
@@ -468,10 +468,10 @@ class FieldEntry
sw::hack::Position maStartPos;
sal_uInt16 mnFieldId;
sal_uLong mnObjLocFc;
- FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
- FieldEntry(const FieldEntry &rOther) throw();
- FieldEntry &operator=(const FieldEntry &rOther) throw();
- void Swap(FieldEntry &rOther) throw();
+ WW8FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
+ WW8FieldEntry(const WW8FieldEntry &rOther) throw();
+ WW8FieldEntry &operator=(const WW8FieldEntry &rOther) throw();
+ void Swap(WW8FieldEntry &rOther) throw();
SwNodeIndex GetPtNode() { return maStartPos.GetPtNode(); };
xub_StrLen GetPtCntnt() { return maStartPos.GetPtCntnt(); };
@@ -494,7 +494,7 @@ private:
WW8PLCFxSaveAll maPLCFxSave;
SwPosition maTmpPos;
std::deque<bool> maOldApos;
- std::deque<FieldEntry> maOldFieldStack;
+ std::deque<WW8FieldEntry> maOldFieldStack;
SwWW8FltControlStack* mpOldStck;
SwWW8FltAnchorStack* mpOldAnchorStck;
sw::util::RedlineStack *mpOldRedlines;
@@ -985,8 +985,8 @@ private:
where the end point will fall, to do so fully correctly duplicates the
main logic of the filter itself.
*/
- std::deque<FieldEntry> maFieldStack;
- typedef std::deque<FieldEntry>::const_iterator mycFieldIter;
+ std::deque<WW8FieldEntry> maFieldStack;
+ typedef std::deque<WW8FieldEntry>::const_iterator mycFieldIter;
/*
A stack of open footnotes. Should only be one in it at any time.
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index bffc240..412fb14 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -413,7 +413,7 @@ long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
SwPosition aStart(*pPaM->GetPoint());
if (!maFieldStack.empty())
{
- const FieldEntry &rTest = maFieldStack.back();
+ const WW8FieldEntry &rTest = maFieldStack.back();
aStart = rTest.maStartPos;
}
@@ -826,56 +826,56 @@ bool AcceptableNestedField(sal_uInt16 nFieldCode)
}
}
-FieldEntry::FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw()
+WW8FieldEntry::WW8FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw()
: maStartPos(rPos), mnFieldId(nFieldId), mnObjLocFc(0)
{
}
-FieldEntry::FieldEntry(const FieldEntry &rOther) throw()
+WW8FieldEntry::WW8FieldEntry(const WW8FieldEntry &rOther) throw()
: maStartPos(rOther.maStartPos), mnFieldId(rOther.mnFieldId), mnObjLocFc(rOther.mnObjLocFc)
{
}
-void FieldEntry::Swap(FieldEntry &rOther) throw()
+void WW8FieldEntry::Swap(WW8FieldEntry &rOther) throw()
{
std::swap(maStartPos, rOther.maStartPos);
std::swap(mnFieldId, rOther.mnFieldId);
}
-FieldEntry &FieldEntry::operator=(const FieldEntry &rOther) throw()
+WW8FieldEntry &WW8FieldEntry::operator=(const WW8FieldEntry &rOther) throw()
{
- FieldEntry aTemp(rOther);
+ WW8FieldEntry aTemp(rOther);
Swap(aTemp);
return *this;
}
-::rtl::OUString FieldEntry::GetBookmarkName()
+::rtl::OUString WW8FieldEntry::GetBookmarkName()
{
return msBookmarkName;
}
-::rtl::OUString FieldEntry::GetBookmarkCode()
+::rtl::OUString WW8FieldEntry::GetBookmarkCode()
{
return msMarkCode;
}
-void FieldEntry::SetBookmarkName(::rtl::OUString bookmarkName)
+void WW8FieldEntry::SetBookmarkName(::rtl::OUString bookmarkName)
{
msBookmarkName=bookmarkName;
}
-void FieldEntry::SetBookmarkType(::rtl::OUString bookmarkType)
+void WW8FieldEntry::SetBookmarkType(::rtl::OUString bookmarkType)
{
msMarkType=bookmarkType;
}
-void FieldEntry::SetBookmarkCode(::rtl::OUString bookmarkCode)
+void WW8FieldEntry::SetBookmarkCode(::rtl::OUString bookmarkCode)
{
msMarkCode = bookmarkCode;
}
-::sw::mark::IFieldmark::parameter_map_t& FieldEntry::getParameters() {
+::sw::mark::IFieldmark::parameter_map_t& WW8FieldEntry::getParameters() {
return maParams;
}
@@ -1020,7 +1020,7 @@ long SwWW8ImplReader::Read_Field(WW8PLCFManResult* pRes)
bool bCodeNest = aF.bCodeNest;
if ( aF.nId == 6 ) bCodeNest = false; // We can handle them and loose the inner data
- maFieldStack.push_back(FieldEntry(*pPaM->GetPoint(), aF.nId));
+ maFieldStack.push_back(WW8FieldEntry(*pPaM->GetPoint(), aF.nId));
if (bNested)
return 0;
--
1.7.4.4
Context
- [PATCH] Fix for sw_filter_test crash due to ambiguous FieldEntry destructor · Kristian Rietveld
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.