Przeglądaj źródła

HPCC-14681 Fix "double free" memory in ESP esdl logging

In https://github.com/hpcc-systems/HPCC-Platform/pull/9610,
three set methods are used to pass log entry items. The set
methods call setown on those items without using LINK. The
LINKs are added in this fix.

Related functions are renamed to indicate the ownership
requirement.

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 8 lat temu
rodzic
commit
a7031a2c53

+ 5 - 5
esp/logging/loggingmanager/loggingmanager.h

@@ -27,11 +27,11 @@
 
 interface IEspLogEntry  : implements IInterface
 {
-    virtual void setEspContext(IEspContext* ctx)  = 0;
-    virtual void setUserContextTree(IPropertyTree* tree) = 0;
-    virtual void setUserRequestTree(IPropertyTree* tree) = 0;
-    virtual void setLogInfoTree(IPropertyTree* tree) = 0;
-    virtual void setExtraLog(IInterface* extra) = 0;
+    virtual void setOwnEspContext(IEspContext* ctx)  = 0;
+    virtual void setOwnUserContextTree(IPropertyTree* tree) = 0;
+    virtual void setOwnUserRequestTree(IPropertyTree* tree) = 0;
+    virtual void setOwnLogInfoTree(IPropertyTree* tree) = 0;
+    virtual void setOwnExtraLog(IInterface* extra) = 0;
     virtual void setOption(const char* ptr) = 0;
     virtual void setLogContent(const char* ptr) = 0;
     virtual void setBackEndResp(const char* ptr) = 0;

+ 5 - 5
esp/logging/loggingmanager/loggingmanager.hpp

@@ -45,11 +45,11 @@ public:
 
     CEspLogEntry(void) { };
 
-    void setEspContext(IEspContext* ctx) { espContext.setown(ctx); };
-    void setUserContextTree(IPropertyTree* tree) { userContextTree.setown(tree); };
-    void setUserRequestTree(IPropertyTree* tree) { userRequestTree.setown(tree); };
-    void setLogInfoTree(IPropertyTree* tree) { logInfoTree.setown(tree); };
-    void setExtraLog(IInterface* extra) { extraLog.setown(extra); };
+    void setOwnEspContext(IEspContext* ctx) { espContext.setown(ctx); };
+    void setOwnUserContextTree(IPropertyTree* tree) { userContextTree.setown(tree); };
+    void setOwnUserRequestTree(IPropertyTree* tree) { userRequestTree.setown(tree); };
+    void setOwnLogInfoTree(IPropertyTree* tree) { logInfoTree.setown(tree); };
+    void setOwnExtraLog(IInterface* extra) { extraLog.setown(extra); };
     void setOption(const char* ptr) { option.set(ptr); };
     void setLogContent(const char* ptr) { logContent.set(ptr); };
     void setBackEndResp(const char* ptr) { backEndResp.set(ptr); };

+ 4 - 4
esp/logging/test/logging_test.cpp

@@ -139,9 +139,9 @@ void sendRequest()
         Sleep(5000); //Waiting for loggingManager to start
         Owned<IEspLogEntry> entry = loggingManager->createLogEntry();
         entry->setOption(option.str());
-        entry->setEspContext(espContext);
-        entry->setUserContextTree(userContextTree);
-        entry->setUserRequestTree(userRequestTree);
+        entry->setOwnEspContext(LINK(espContext));
+        entry->setOwnUserContextTree(LINK(userContextTree));
+        entry->setOwnUserRequestTree(LINK(userRequestTree));
         entry->setUserResp(userRespXML.str());
         entry->setBackEndResp(backEndResp);
         entry->setLogDatasets(logDatasetsXML.str());
@@ -169,7 +169,7 @@ void sendRequest()
 
         Owned<IEspLogEntry> entry = loggingManager->createLogEntry();
         entry->setOption(option.str());
-        entry->setEspContext(espContext);
+        entry->setOwnEspContext(LINK(espContext));
         entry->setLogContent(logContentXML.str());
         loggingManager->updateLog(entry, status);
     }

+ 3 - 3
esp/services/esdl_svc_engine/esdl_binding.cpp

@@ -664,9 +664,9 @@ bool EsdlServiceImpl::handleResultLogging(IEspContext &espcontext, IPropertyTree
     {
         Owned<IEspLogEntry> entry = m_oLoggingManager->createLogEntry();
         entry->setOption(LOGGINGDBSINGLEINSERT);
-        entry->setEspContext(&espcontext);
-        entry->setUserContextTree(reqcontext);
-        entry->setUserRequestTree(request);
+        entry->setOwnEspContext(LINK(&espcontext));
+        entry->setOwnUserContextTree(LINK(reqcontext));
+        entry->setOwnUserRequestTree(LINK(request));
         entry->setUserResp(finalresp);
         entry->setBackEndResp(rawresp);
         entry->setLogDatasets(logdata);