aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Leach <mike.leach@linaro.org>2023-08-15 16:08:24 +0100
committerMike Leach <mike.leach@linaro.org>2023-08-15 16:08:24 +0100
commitcdadb5031881e0db99f502585d571d28384e25b9 (patch)
treea081277f9e208541fe3350503afe5c6a05f8220a
parent78ce8ef47c55a489b0ca575b981cd4856d03f44b (diff)
downloadOpenCSD-cdadb5031881e0db99f502585d571d28384e25b9.tar.gz
opencsd: Fix memory leak for C-API output object (github #55)
Need local copy of Generic output object to correctly return via get func and delete on C-API destroy decode tree. Reported-by: 'holio0' (github issue #55) Signed-off-by: Mike Leach <mike.leach@linaro.org>
-rw-r--r--decoder/source/c_api/ocsd_c_api.cpp8
-rw-r--r--decoder/source/ocsd_dcd_tree.cpp2
2 files changed, 10 insertions, 0 deletions
diff --git a/decoder/source/c_api/ocsd_c_api.cpp b/decoder/source/c_api/ocsd_c_api.cpp
index 750c847..2cc2334 100644
--- a/decoder/source/c_api/ocsd_c_api.cpp
+++ b/decoder/source/c_api/ocsd_c_api.cpp
@@ -256,8 +256,16 @@ OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle,
{
GenTraceElemCBObj * pCBObj = new (std::nothrow)GenTraceElemCBObj(pFn, p_context);
+ ITrcGenElemIn* pCurrIF;
+
if(pCBObj)
{
+ /* delete any previous element we might have set */
+ pCurrIF = ((DecodeTree*)handle)->getGenTraceElemOutI();
+ if (pCurrIF)
+ delete static_cast<GenTraceElemCBObj*>(pCurrIF);
+
+ /* set the new one */
((DecodeTree *)handle)->setGenTraceElemOutI(pCBObj);
return OCSD_OK;
}
diff --git a/decoder/source/ocsd_dcd_tree.cpp b/decoder/source/ocsd_dcd_tree.cpp
index 8e29269..49ceb92 100644
--- a/decoder/source/ocsd_dcd_tree.cpp
+++ b/decoder/source/ocsd_dcd_tree.cpp
@@ -174,6 +174,8 @@ void DecodeTree::setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem)
pElem->getDecoderMngr()->attachOutputSink(pElem->getDecoderHandle(),i_gen_trace_elem);
pElem = getNextElement(elemID);
}
+ /* set local copy of interface to return in getGenTraceElemOutI */
+ m_i_gen_elem_out = i_gen_trace_elem;
}
ocsd_err_t DecodeTree::createMemAccMapper(memacc_mapper_t type /* = MEMACC_MAP_GLOBAL*/ )