From fd40266f767e51e649fb48376e25f47a60d79765 Mon Sep 17 00:00:00 2001 From: Mark Rowe Date: Mon, 11 May 2026 18:49:26 -0700 Subject: Fix incorrect reference counting in C++ API --- workflow.cpp | 58 ++++++++++++++++++++++------------------------------------ 1 file changed, 22 insertions(+), 36 deletions(-) (limited to 'workflow.cpp') diff --git a/workflow.cpp b/workflow.cpp index 5be636d2..bf5b5579 100644 --- a/workflow.cpp +++ b/workflow.cpp @@ -375,11 +375,7 @@ bool WorkflowMachine::PostRequest(const std::string& command) rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -402,13 +398,23 @@ WorkflowMachine::WorkflowMachine(Ref function): m_function(function) } -bool WorkflowMachine::PostJsonRequest(const std::string& request) +string WorkflowMachine::PostRawRequest(const char* request) { - string jsonResult; + char* result; if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), request.c_str()); + result = BNPostWorkflowRequestForFunction(m_function->GetObject(), request); else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), request.c_str()); + result = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), request); + + string jsonResult(result); + BNFreeString(result); + return jsonResult; +} + + +bool WorkflowMachine::PostJsonRequest(const std::string& request) +{ + string jsonResult = PostRawRequest(request.c_str()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -450,11 +456,7 @@ WorkflowMachine::Status WorkflowMachine::GetStatus() rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -532,11 +534,7 @@ bool WorkflowMachine::SetLogEnabled(bool enable, bool global) rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -558,11 +556,7 @@ std::optional WorkflowMachine::QueryOverride(const string& activity) rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -585,11 +579,7 @@ bool WorkflowMachine::SetOverride(const string& activity, bool enable) rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -611,11 +601,7 @@ bool WorkflowMachine::ClearOverride(const string& activity) rapidjson::Writer writer(buffer); request.Accept(writer); - string jsonResult; - if (m_function) - jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString()); - else - jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString()); + string jsonResult = PostRawRequest(buffer.GetString()); rapidjson::Document response(rapidjson::kObjectType); response.Parse(jsonResult.c_str()); @@ -720,7 +706,7 @@ Ref Workflow::RegisterActivity(Ref activity, const vector Workflow::GetActivity(const string& activity) { BNActivity* activityObject = BNWorkflowGetActivity(m_object, activity.c_str()); - return new Activity(BNNewActivityReference(activityObject)); + return new Activity(activityObject); } -- cgit v1.3.1