[Libreoffice] odd ND_FOONODE bits was fdo#42147: fix crash
Caolán McNamara
caolanm at redhat.com
Fri Dec 9 03:34:24 PST 2011
On Fri, 2011-12-09 at 09:44 +0400, Ivan Timofeev wrote:
> 08.12.2011 23:36, Ivan Timofeev пишет:
> This is not a fix for the mentioned bug, the proper fix was
> http://cgit.freedesktop.org/libreoffice/core/commit/?id=3524727db0f3cfecf3a47046795c527808c10c3e
> which is now backported to 3-4.
I wouldn't call my fix a great solution, more of a band-aid, but good to
know it makes the crash go away.
Looking at your original patch anyway it looks right to me. Can't cast
something whose NodeType is ND_CONTENTNODE which is a superset of the
ND_TEXTNODE bits to a SwTxtNode seeing as a SwTxtNode inherits from
SwCntntNode so not all SwCntntNodes are SwTxtNodes.
It's all a little strange, i.e.
ND_TEXTNODE of 0x08 and a
ND_CONTENTNODE of 0x38
with
inline sal_Bool SwNode::IsCntntNode() const
{
return ND_CONTENTNODE & nNodeType ? sal_True : sal_False;
}
inline sal_Bool SwNode::IsTxtNode() const
{
return ND_TEXTNODE == nNodeType ? sal_True : sal_False;
}
sees very odd. It suggests that IsCntntNode on a SwTxtNode is "false",
even though a SwTxtNode isa SwCntntNode.
Looking at...
const BYTE ND_TEXTNODE = 0x08;
const BYTE ND_GRFNODE = 0x10;
const BYTE ND_OLENODE = 0x20;
const BYTE ND_CONTENTNODE = 0x38;
const BYTE ND_NOTXTNODE = 0x30;
and then http://docs.libreoffice.org/sw/html/classSwCntntNode.html
this is equivalent to
const BYTE ND_GRFNODE = 0x10;
const BYTE ND_OLENODE = 0x20;
const BYTE ND_NOTXTNODE = ND_GRFNODE | ND_OLENODE;
const BYTE ND_TEXTNODE = 0x08;
const BYTE ND_CONTENTNODE = ND_NOTXTNODE | ND_TEXTNODE;
this presumably is the derivation of the bits.
These bits seem inverted in the sense that the default bits for a
baseclass are the superset of all possible derived class bits!?
On the other hand
const BYTE ND_STARTNODE = 0x02;
const BYTE ND_TABLENODE = 0x06;
const BYTE ND_SECTIONNODE = 0x42;
is equivalent to
const BYTE ND_STARTNODE = 0x02;
const BYTE ND_TABLENODE = 0x04 | ND_STARTNODE;
const BYTE ND_SECTIONNODE = 0x40 | ND_STARTNODE;
and the hierarchy there is
http://docs.libreoffice.org/sw/html/classSwStartNode.html
i.e. more derived class *add* more bits, which makes far more sense.
caolanm->mstahl: Any insights here into why this is the way it is ?
Under what circumstances *can* IsCntntNode be true, I mean on a casual
inspection do we have any bare SwCntntNodes in existance, as opposed to
things that inherit from it and set a different NodeType
http://docs.libreoffice.org/sw/html/classSwCntntNode.html
C.
More information about the LibreOffice
mailing list