connectivity/source/drivers/ado/APreparedStatement.cxx |    2 
 connectivity/source/parse/sqlbison.y                   |    3 -
 connectivity/source/parse/sqlnode.cxx                  |   46 +++++++----------
 include/connectivity/sqlnode.hxx                       |    2 
 4 files changed, 22 insertions(+), 31 deletions(-)

New commits:
commit 46169355558e017a94a1859ba206fd9e4e1e9106
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Sep 16 16:24:31 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Sat Sep 17 10:52:40 2022 +0200

    cid#1500499 Resource leak
    
    the only change should be to the two trailing cases in
    OSQLParseNode::substituteParameterNames which do seem to leak.  The
    closest I got to triggering the actual code is toggling into sqlview
    mode of a query but couldn't quite construct a sql statement to trigger
    it.
    
    Change-Id: I320dc4df3b18a18b236c91ee30329c10001c9a08
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140081
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/connectivity/source/drivers/ado/APreparedStatement.cxx 
b/connectivity/source/drivers/ado/APreparedStatement.cxx
index cf2339fdc951..9e17d71b0bed 100644
--- a/connectivity/source/drivers/ado/APreparedStatement.cxx
+++ b/connectivity/source/drivers/ado/APreparedStatement.cxx
@@ -442,7 +442,7 @@ void 
OPreparedStatement::replaceParameterNodeName(OSQLParseNode const * _pNode,
         if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() == 1)
         {
             OSQLParseNode* pNewNode = new OSQLParseNode(OUString(":") 
,SQLNodeType::Punctuation,0);
-            delete pChildNode->replace(pChildNode->getChild(0),pNewNode);
+            pChildNode->replaceAndDelete(pChildNode->getChild(0), pNewNode);
             OUString sParameterName = _sDefaultName + 
OUString::number(++_rParameterCount);
             pChildNode->append(new OSQLParseNode( 
sParameterName,SQLNodeType::Name,0));
         }
diff --git a/connectivity/source/parse/sqlbison.y 
b/connectivity/source/parse/sqlbison.y
index 59d8b2532430..6db0da9a4180 100644
--- a/connectivity/source/parse/sqlbison.y
+++ b/connectivity/source/parse/sqlbison.y
@@ -4749,8 +4749,7 @@ sal_Int16 OSQLParser::buildStringNodes(OSQLParseNode*& 
pLiteral)
                OSQLParseNode* pParent = pLiteral->getParent();
 
                OSQLParseNode* pNewNode = new 
OSQLInternalNode(pLiteral->getTokenValue(), SQLNodeType::String);
-               pParent->replace(pLiteral, pNewNode);
-               delete pLiteral;
+               pParent->replaceAndDelete(pLiteral, pNewNode);
                pLiteral = nullptr;
                return 1;
        }
diff --git a/connectivity/source/parse/sqlnode.cxx 
b/connectivity/source/parse/sqlnode.cxx
index f9bee9da69b6..44e0c2bba2a9 100644
--- a/connectivity/source/parse/sqlnode.cxx
+++ b/connectivity/source/parse/sqlnode.cxx
@@ -92,8 +92,7 @@ namespace
 
     void replaceAndReset(connectivity::OSQLParseNode*& 
_pResetNode,connectivity::OSQLParseNode* _pNewNode)
     {
-        _pResetNode->getParent()->replace(_pResetNode, _pNewNode);
-        delete _pResetNode;
+        _pResetNode->getParent()->replaceAndDelete(_pResetNode, _pNewNode);
         _pResetNode = _pNewNode;
     }
 
@@ -1500,7 +1499,7 @@ void 
OSQLParseNode::substituteParameterNames(OSQLParseNode const * _pNode)
         if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() > 1)
         {
             OSQLParseNode* pNewNode = new OSQLParseNode("?" 
,SQLNodeType::Punctuation,0);
-            delete pChildNode->replace(pChildNode->getChild(0),pNewNode);
+            pChildNode->replaceAndDelete(pChildNode->getChild(0), pNewNode);
             sal_Int32 nChildCount = pChildNode->count();
             for(sal_Int32 j=1;j < nChildCount;++j)
                 delete pChildNode->removeAt(1);
@@ -1865,9 +1864,9 @@ void OSQLParseNode::disjunctiveNormalForm(OSQLParseNode*& 
pSearchCondition)
             disjunctiveNormalForm(pSearchCondition);
         }
         else if(SQL_ISRULE(pLeft,boolean_primary) && 
(!SQL_ISRULE(pLeft->getChild(1),search_condition) || 
!SQL_ISRULE(pLeft->getChild(1),boolean_term)))
-            pSearchCondition->replace(pLeft, pLeft->removeAt(1));
+            pSearchCondition->replaceAndDelete(pLeft, pLeft->removeAt(1));
         else if(SQL_ISRULE(pRight,boolean_primary) && 
(!SQL_ISRULE(pRight->getChild(1),search_condition) || 
!SQL_ISRULE(pRight->getChild(1),boolean_term)))
-            pSearchCondition->replace(pRight, pRight->removeAt(1));
+            pSearchCondition->replaceAndDelete(pRight, pRight->removeAt(1));
     }
 }
 
@@ -1954,8 +1953,7 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& 
pSearchCondition, bool
                 assert(SQL_ISTOKEN(pNot,NOT));
                 pNotNot = new 
OSQLParseNode(OUString(),SQLNodeType::Rule,OSQLParser::RuleID(OSQLParseNode::sql_not));
             }
-            pComparison->replace(pNot, pNotNot);
-            delete pNot;
+            pComparison->replaceAndDelete(pNot, pNotNot);
         }
         else
         {
@@ -1984,8 +1982,7 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& 
pSearchCondition, bool
                 pNewComparison = new 
OSQLParseNode("=",SQLNodeType::Equal,SQL_EQUAL);
                 break;
             }
-            pSearchCondition->replace(pComparison, pNewComparison);
-            delete pComparison;
+            pSearchCondition->replaceAndDelete(pComparison, pNewComparison);
         }
     }
 
@@ -2007,8 +2004,7 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& 
pSearchCondition, bool
             assert(SQL_ISTOKEN(pNot,NOT));
             pNotNot = new 
OSQLParseNode(OUString(),SQLNodeType::Rule,OSQLParser::RuleID(OSQLParseNode::sql_not));
         }
-        pPart2->replace(pNot, pNotNot);
-        delete pNot;
+        pPart2->replaceAndDelete(pNot, pNotNot);
     }
     else if(bNegate && SQL_ISRULE(pSearchCondition,like_predicate))
     {
@@ -2018,8 +2014,7 @@ void OSQLParseNode::negateSearchCondition(OSQLParseNode*& 
pSearchCondition, bool
             pNotNot = new 
OSQLParseNode("NOT",SQLNodeType::Keyword,SQL_TOKEN_NOT);
         else
             pNotNot = new 
OSQLParseNode(OUString(),SQLNodeType::Rule,OSQLParser::RuleID(OSQLParseNode::sql_not));
-        pSearchCondition->getChild( 1 )->replace(pNot, pNotNot);
-        delete pNot;
+        pSearchCondition->getChild( 1 )->replaceAndDelete(pNot, pNotNot);
     }
 }
 
@@ -2380,27 +2375,24 @@ OSQLParseNode* OSQLParseNode::removeAt(sal_uInt32 nPos)
 
 // Replace methods
 
-OSQLParseNode* OSQLParseNode::replace(OSQLParseNode* pOldSubNode, 
OSQLParseNode* pNewSubNode )
+void OSQLParseNode::replaceAndDelete(OSQLParseNode* pOldSubNode, 
OSQLParseNode* pNewSubNode )
 {
     assert(pOldSubNode != nullptr && pNewSubNode != nullptr && "OSQLParseNode: 
invalid nodes");
-    OSL_ENSURE(pNewSubNode->getParent() == nullptr, "OSQLParseNode: node 
already has getParent");
-    OSL_ENSURE(std::any_of(m_aChildren.begin(), m_aChildren.end(),
-                   [&] (std::unique_ptr<OSQLParseNode> const & r) { return 
r.get() == pOldSubNode; }),
-               "OSQLParseNode::Replace() Node not element of parent");
-    OSL_ENSURE(std::none_of(m_aChildren.begin(), m_aChildren.end(),
-                   [&] (std::unique_ptr<OSQLParseNode> const & r) { return 
r.get() == pNewSubNode; }),
-               "OSQLParseNode::Replace() Node already element of parent");
+    assert(pOldSubNode != pNewSubNode && "OSQLParseNode: same node");
+    assert(pNewSubNode->getParent() == nullptr && "OSQLParseNode: node already 
has getParent");
+    assert(std::any_of(m_aChildren.begin(), m_aChildren.end(),
+                   [&] (std::unique_ptr<OSQLParseNode> const & r) { return 
r.get() == pOldSubNode; })
+               && "OSQLParseNode::Replace() Node not element of parent");
+    assert(std::none_of(m_aChildren.begin(), m_aChildren.end(),
+                   [&] (std::unique_ptr<OSQLParseNode> const & r) { return 
r.get() == pNewSubNode; })
+               && "OSQLParseNode::Replace() Node already element of parent");
 
     pOldSubNode->setParent( nullptr );
     pNewSubNode->setParent( this );
     auto it = std::find_if(m_aChildren.begin(), m_aChildren.end(),
         [&pOldSubNode](const std::unique_ptr<OSQLParseNode>& rxChild) { return 
rxChild.get() == pOldSubNode; });
-    if (it != m_aChildren.end())
-    {
-        it->release();
-        it->reset(pNewSubNode);
-    }
-    return pOldSubNode;
+    assert(it != m_aChildren.end());
+    it->reset(pNewSubNode);
 }
 
 void OSQLParseNode::parseLeaf(OUStringBuffer& rString, const 
SQLParseNodeParameter& rParam) const
diff --git a/include/connectivity/sqlnode.hxx b/include/connectivity/sqlnode.hxx
index b59c26f95432..630e6e1afc65 100644
--- a/include/connectivity/sqlnode.hxx
+++ b/include/connectivity/sqlnode.hxx
@@ -258,7 +258,7 @@ namespace connectivity
         void append(OSQLParseNode* pNewSubTree);
         void insert(sal_uInt32 nPos, OSQLParseNode* pNewSubTree);
 
-        OSQLParseNode* replace(OSQLParseNode* pOldSubTree, OSQLParseNode* 
pNewSubTree);
+        void replaceAndDelete(OSQLParseNode* pOldSubTree, OSQLParseNode* 
pNewSubTree);
 
         OSQLParseNode* removeAt(sal_uInt32 nPos);
 

Reply via email to