[PATCH]: Fix for rtfexport subsequenttest

LeMoyne Castle lemoyne.castle at gmail.com
Fri Dec 21 10:23:02 PST 2012


Hi,

The rtfexport subsequent test was failing with a segfault for me.
I used EXPORT DEBUGCPPUNIT=TRUE

and got the following stack trace:

Program received signal SIGSEGV, Segmentation fault.
0x478bb2d7 in RtfAttributeOutput::WriteHex(unsigned char const*, unsigned
long, SvStream*, unsigned long) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#0  0x478bb2d7 in RtfAttributeOutput::WriteHex(unsigned char const*,
unsigned long, SvStream*, unsigned long) () from
/home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#1  0x478bb7ee in ExportPICT(SwFlyFrmFmt const*, Size const&, Size const&,
Size const&, SwCropGrf const&, char const*, unsigned char const*, unsigned
long, RtfExport const&, SvStream*) () from
/home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#2  0x478bc01b in RtfAttributeOutput::FlyFrameOLEReplacement(SwFlyFrmFmt
const*, SwOLENode&, Size const&) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#3  0x478bc2d9 in RtfAttributeOutput::FlyFrameOLEMath(SwFlyFrmFmt const*,
SwOLENode&, Size const&) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#4  0x478bc3f9 in RtfAttributeOutput::FlyFrameOLE(SwFlyFrmFmt const*,
SwOLENode&, Size const&) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#5  0x478c0fa8 in RtfAttributeOutput::OutputFlyFrame_Impl(sw::Frame const&,
Point const&) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#6  0x4790bd0c in AttributeOutputBase::TextFlyContent(SwFmtFlyCnt const&)
() from /home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#7  0x479105d7 in AttributeOutputBase::OutputItem(SfxPoolItem const&) ()
from /home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#8  0x479117a9 in MSWordExportBase::ExportPoolItemsToCHP(std::map<unsigned
short, SfxPoolItem const*, sw::util::ItemSort,
std::allocator<std::pair<unsigned short const, SfxPoolItem const*> > >&,
unsigned short) () from /home/jlcastle/LibOdev/libo/solver/
unxlngi6.pro/lib/libmswordlo.so
#9  0x478e7c7e in SwWW8AttrIter::OutAttr(unsigned short, bool) () from
/home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#10 0x478e9d03 in MSWordExportBase::OutputTextNode(SwTxtNode const&) ()
from /home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so
#11 0x478c5c6e in RtfExport::OutputTextNode(SwTxtNode const&) () from
/home/jlcastle/LibOdev/libo/solver/unxlngi6.pro/lib/libmswordlo.so

I poked around looking at buffers and sizes and made this correction before
a call that matches #1:

diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx
b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 36d1cea..9a65c42 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -3347,7 +3347,7 @@ void RtfAttributeOutput::FlyFrameOLEReplacement(const
SwFlyFrmFmt* pFlyFrmFmt, S

<< edited and inserted more code here for full context...

    const sal_uInt8* pGraphicAry = 0;
    SvMemoryStream aStream;
    if (GraphicConverter::Export(aStream, *pGraphic, CVT_PNG) !=
ERRCODE_NONE)
        OSL_FAIL("failed to export the graphic");
    aStream.Seek(STREAM_SEEK_TO_END);
    sal_uInt32 nSize = aStream.Tell();

    pGraphicAry = (sal_uInt8*)aStream.GetData();

    m_aRunText->append(ExportPICT( pFlyFrmFmt, aSize, aRendered, aMapped,
rCr, pBLIPType, pGraphicAry, nSize, m_rExport ));
    m_aRunText->append("}"); // shppict
    m_aRunText->append("{" OOO_STRING_SVTOOLS_RTF_NONSHPPICT);
    pBLIPType = OOO_STRING_SVTOOLS_RTF_WMETAFILE;
    SvMemoryStream aWmfStream;
    if (GraphicConverter::Export(aWmfStream, *pGraphic, CVT_WMF) !=
ERRCODE_NONE)
        OSL_FAIL("failed to export the graphic");
    aWmfStream.Seek(STREAM_SEEK_TO_END);
    nSize = aWmfStream.Tell();

-    pGraphicAry = (sal_uInt8*)aStream.GetData();
+    pGraphicAry = (sal_uInt8*)aWmfStream.GetData();

    m_aRunText->append(ExportPICT( pFlyFrmFmt, aSize, aRendered, aMapped,
rCr, pBLIPType, pGraphicAry, nSize, m_rExport ));
    m_aRunText->append("}"); // nonshppict
}

Basically, fix a typo.  rtfexport test now passes instead of crashes.

I got myself sideways with gerrit or I would have submitted this there.
Submitting patch here so that no one else has to be stuck with the broken
subsequent test.

One question I have is:
Should I open a new bug for the rtfexport subsequent test failure?
I will certainly open one if it comes back for me, but should I open one
for this patch?

Plugging back in,
LeMoyne
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20121221/d8808dfb/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fix-for-rtfexport-subsequenttest.patch
Type: application/octet-stream
Size: 1250 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20121221/d8808dfb/attachment.obj>


More information about the LibreOffice mailing list