Skip to content

Commit 1e11a0d

Browse files
committed
loading an empty xml stream, created wrong root node type
Noticed in Dali, when loading a 0 length store file. The IPTreeMaker used to load, created a standard impl. of a IPropertyTree, when it should have/needed to ask the maker to create the appropriate type. The result (in Dali) was that it assumed all nodes were of the correct impl. (CServerRemoteTree) and crashed accessing it via a cast. NB: only an issue when loading an empty file/stream Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
1 parent 1ecbcd6 commit 1e11a0d

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed

common/thorhelper/thorxmlread.cpp

+18-13
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,7 @@ class CXMLParse : public CInterface, implements IXMLParse
16191619
CopyCIArrayOf<CParseStackInfo> stack, freeParseInfo;
16201620
IPTreeMaker *maker;
16211621
Linked<CMarkReadBase> marking;
1622+
Owned<COffsetNodeCreator> nodeCreator;
16221623
void *utf8Translator;
16231624
unsigned level;
16241625
bool contentRequired;
@@ -1647,25 +1648,13 @@ class CXMLParse : public CInterface, implements IXMLParse
16471648
void init()
16481649
{
16491650
level = 0;
1650-
Owned<COffsetNodeCreator> nodeCreator = new COffsetNodeCreator();
1651+
nodeCreator.setown(new COffsetNodeCreator());
16511652
maker = createRootLessPTreeMaker(ipt_none, NULL, nodeCreator);
16521653
bool f;
16531654
utf8Translator = rtlOpenCodepageConverter("utf-8", "latin1", f);
16541655
if (f)
16551656
throw MakeStringException(0, "Failed to initialize unicode utf-8 translator");
16561657
}
1657-
void reset()
1658-
{
1659-
level = 0;
1660-
ForEachItemIn(i, stack)
1661-
delete &stack.item(i);
1662-
ForEachItemIn(i2, freeParseInfo)
1663-
delete &freeParseInfo.item(i2);
1664-
stack.kill();
1665-
freeParseInfo.kill();
1666-
if (marking)
1667-
marking->reset();
1668-
}
16691658
void setMarkingStream(CMarkReadBase &_marking) { marking.set(&_marking); }
16701659
CXPath &queryXPath() { return xpath; }
16711660

@@ -1896,6 +1885,22 @@ class CXMLParse : public CInterface, implements IXMLParse
18961885
}
18971886
virtual IPropertyTree *queryRoot() { return maker->queryRoot(); }
18981887
virtual IPropertyTree *queryCurrentNode() { return maker->queryCurrentNode(); }
1888+
virtual void reset()
1889+
{
1890+
level = 0;
1891+
ForEachItemIn(i, stack)
1892+
delete &stack.item(i);
1893+
ForEachItemIn(i2, freeParseInfo)
1894+
delete &freeParseInfo.item(i2);
1895+
stack.kill();
1896+
freeParseInfo.kill();
1897+
if (marking)
1898+
marking->reset();
1899+
}
1900+
virtual IPropertyTree *create(const char *tag)
1901+
{
1902+
return nodeCreator->create(tag);
1903+
}
18991904
} *iXMLMaker;
19001905

19011906
public:

system/jlib/jptree.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -5104,7 +5104,7 @@ IPropertyTree *createPTree(ISimpleReadStream &stream, byte flags, XmlReaderOptio
51045104
if (iMaker->queryRoot())
51055105
return LINK(iMaker->queryRoot());
51065106
else
5107-
return createPTree(flags);
5107+
return iMaker->create(NULL);
51085108
}
51095109

51105110
IPropertyTree *createPTree(IFileIO &ifileio, byte flags, XmlReaderOptions readFlags, IPTreeMaker *iMaker)

system/jlib/jptree.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ interface IPTreeMaker : extends IPTreeNotifyEvent
156156
virtual IPropertyTree *queryRoot() = 0;
157157
virtual IPropertyTree *queryCurrentNode() = 0;
158158
virtual void reset() = 0;
159+
virtual IPropertyTree *create(const char *tag) = 0;
159160
};
160161

161162
interface IPTreeNodeCreator : extends IInterface

system/jlib/jptree.ipp

+4
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,10 @@ public:
630630
}
631631
currentNode = NULL;
632632
}
633+
virtual IPropertyTree *create(const char *tag)
634+
{
635+
return nodeCreator->create(tag);
636+
}
633637
};
634638

635639
#ifdef __64BIT__

0 commit comments

Comments
 (0)