Hi all,

I can now narrow down the error somewhat.

Look at method SwTextFrame::FormatImpl() in
https://opengrok.libreoffice.org/xref/core/sw/source/core/text/frmform.cxx?r=7d7ca347#1832
It creates
   SwTextFormatInfo aInf( pRenderContext, this );
Later down in the for-loop, aInf is used. The for-loop iterates over
   pObj = aInf.GetTextFly().GetAnchoredObjList()
and performs
   aInf.GetTextFly().AnchoredObjToRect(pObj, aRect)
AnchoredObjToRect crashes then because of an invalid pObj.

You see the AnchoredObjList with these steps:
aInf > SwTextPaintInfo > m_aTextFly > mpAnchoredObjList

When aInf is created, mpAnchoredObjList is empty.
After line #1863
    Format_( aLine, aInf );
you can see the invalid item in that list.

This happens not always. When you use the example file of the bug report, first the text of the shape inside the group is handled. That works. Then the line where the group is anchored is handled. And there it happens. If the inline anchored object is not a group but a simple shape with text, first the line is handled and then the text of the shape.


Next I have examined Format_( aLine, aInf ) for the crash case. It is
void SwTextFrame::Format_( SwTextFormatter &rLine, SwTextFormatInfo &rInf const bool bAdjust )
in
https://opengrok.libreoffice.org/xref/core/sw/source/core/text/frmform.cxx?r=7d7ca347#1431
Here watch parameter rInf.
It is OK till #1671. After line #1672
    bFormat = FormatLine( rLine, bPrev );
rInf has the invalid object. That is surprising. The method does no have rInf as parameter.


This method is
bool SwTextFrame::FormatLine( SwTextFormatter &rLine, const bool bPrev )
in
https://opengrok.libreoffice.org/xref/core/sw/source/core/text/frmform.cxx?r=7d7ca347#1296
The adding of the faulty object happens there in #1672
in bFormat = FormatLine( rLine, bPrev );

That method is
bool SwTextFrame::FormatLine( SwTextFormatter &rLine, const bool bPrev )
in
https://opengrok.libreoffice.org/xref/core/sw/source/core/text/frmform.cxx?r=7d7ca347#1296


And there I'm now. I have no idea, how something there changes the parameter rInfo of SwTextFrame::Format_(). And I still do not know, which object is really needed in the above mentioned for-loop. And I still don't know, whether the problem would be solved, when somehow first the line and then the group would be handled.

I appreciate any help.

Kind regards,
Regina

Regina Henschel schrieb am 11.12.2023 um 03:15:
Hi all,

I need help for bug 158451. Problem: A group or a drawing canvas in a docx file crashes Writer, in case it is anchored 'inline' and has a child shape with text. The crash happens in SwAnchoredObject::GetObjRectWithSpaces(). There is no crash, if such group is in an odt file.

It is not a new problem, but it will effect more users now, because the drawing canvas and not the VML fallback is imported now and the drawing canvas is anchored 'inline' as default in Word.

Steps before the crash are
     SwTextFormatter::NewPortion()
     SwTextFormatter::CalcFlyWidth()
     SwTextFly::GetFrame()
     SwTextFly::ForEach()
     SwAnchoredObject::GetObjRectWithSpaces()

I think the crash should be fixed till release, but I'm not familiar with these frames. Do you have tips for me? Do you have an idea why a group from docx is different from a group from odt, for example?

Attila Bakos had worked in that area, but NISZ does no longer exist.

Kind regards,
Regina


Reply via email to