diff options
author | Mike Leach <mike.leach@linaro.org> | 2023-08-15 16:08:24 +0100 |
---|---|---|
committer | Mike Leach <mike.leach@linaro.org> | 2023-08-15 16:08:24 +0100 |
commit | cdadb5031881e0db99f502585d571d28384e25b9 (patch) | |
tree | a081277f9e208541fe3350503afe5c6a05f8220a | |
parent | 78ce8ef47c55a489b0ca575b981cd4856d03f44b (diff) | |
download | OpenCSD-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.cpp | 8 | ||||
-rw-r--r-- | decoder/source/ocsd_dcd_tree.cpp | 2 |
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*/ ) |