From 6e4cf808da4ea846d0f5195d0d684daf4912af43 Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Sun, 8 Jan 2023 22:03:26 +0100 Subject: [PATCH] InsetIndex: add a missing destructor for IndexNode and call it from xhtml() to avoid leaking resources. Corresponding Coverity finding: ** CID 382778: Resource leaks (RESOURCE_LEAK) /home/lasgoutt/src/lyx/coverity/lyx/src/insets/InsetIndex.cpp: 1909 in _ZNK3lyx15InsetPrintIndex5xhtmlB5cxx11ERNS_9XMLStreamERKNS_12OutputParamsE() ________________________________________________________________________________________________________ *** CID 382778: Resource leaks (RESOURCE_LEAK) /home/lasgoutt/src/lyx/coverity/lyx/src/insets/InsetIndex.cpp: 1909 in _ZNK3lyx15InsetPrintIndex5xhtmlB5cxx11ERNS_9XMLStreamERKNS_12OutputParamsE() 1903 } 1904 1905 xs << xml::EndTag("ul"); 1906 xs << xml::CR(); 1907 xs << xml::EndTag("div"); 1908 >>> CID 382778: Resource leaks (RESOURCE_LEAK) >>> Variable "index_root" going out of scope leaks the storage it points to. 1909 return ods.str(); 1910 } 1911 --- src/insets/InsetIndex.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index a6fcae77be..32cabcaddf 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -1658,6 +1658,14 @@ std::string generateCssClassAtDepth(unsigned depth) { struct IndexNode { std::vector entries; std::vector children; + + ~IndexNode() { + for (IndexNode * child : children) { + if (!child) + continue; + delete child; + } + } }; docstring termAtLevel(const IndexNode* node, unsigned depth) @@ -1901,6 +1909,7 @@ docstring InsetPrintIndex::xhtml(XMLStream &, OutputParams const & op) const for (const IndexNode* node : index_root->children) { outputIndexPage(xs, node); } + delete index_root; xs << xml::EndTag("ul"); xs << xml::CR();