From 9ac4dfb0f0ba5be3f21bd3904c99ba67543b1833 Mon Sep 17 00:00:00 2001 From: Richard Knight Date: Thu, 25 Aug 2022 18:14:53 +0100 Subject: fixed string and array memory leaks --- src/opcodes.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/opcodes.cpp') diff --git a/src/opcodes.cpp b/src/opcodes.cpp index 34bba02..e82ce33 100644 --- a/src/opcodes.cpp +++ b/src/opcodes.cpp @@ -95,7 +95,7 @@ public: try { switch (queryData->queryType) { case SCALARSTRING: { - std::string resultString = connection->ScalarString(queryData->sql, queryData->row, queryData->col); + std::string resultString = connection->ScalarString(queryData->sql, csound, queryData->row, queryData->col); if (charData != NULL) { csound->free(charData); } @@ -480,6 +480,7 @@ struct dbscalarstr : csnd::Plugin<1, 4> { static constexpr char const *otypes = "S"; static constexpr char const *itypes = "iSoo"; ConnectionData* connection; + char* resultString; int init() { if (!(connection = getConnection(csound, inargs[0]))) { @@ -489,9 +490,12 @@ struct dbscalarstr : csnd::Plugin<1, 4> { STRINGDAT &result = outargs.str_data(0); LOCK(connection); try { - std::string resultString = connection->ScalarString(sql.data, inargs[2], inargs[3]); - result.size = resultString.length() + 1; - result.data = csound->strdup((char*)resultString.c_str()); + if (resultString != NULL) { + csound->free(resultString); + } + resultString = connection->ScalarString(sql.data, csound, inargs[2], inargs[3]); + result.size = strlen(resultString) + 1; + result.data = resultString; } catch (const std::exception &e) { UNLOCK(connection); return csound->init_error(e.what()); @@ -642,9 +646,9 @@ struct dbscalarstr_kb : csnd::Plugin<1, 4> { STRINGDAT &result = outargs.str_data(0); LOCK(connection); try { - std::string resultString = connection->ScalarString(sql.data, inargs[2], inargs[3]); - result.size = resultString.length() + 1; - result.data = csound->strdup((char*) resultString.c_str()); + char* resultString = connection->ScalarString(sql.data, csound, inargs[2], inargs[3]); + result.size = strlen(resultString) + 1; + result.data = resultString; } catch (const std::exception &e) { UNLOCK(connection); return csound->perf_error(e.what(), this); -- cgit v1.2.3