From 50f0cad0c6066da395210ba958a43cd02d93ee4f Mon Sep 17 00:00:00 2001 From: noctuum <25441068+noctuum@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:41:01 +0500 Subject: [PATCH] Release the xmlrpc array item on a throw xmlrpc_to_target throws for an invalid target, skipping the DECREF. --- src/rpc/xmlrpc_c.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/rpc/xmlrpc_c.cc b/src/rpc/xmlrpc_c.cc index 48b05ad9..e9605e25 100644 --- a/src/rpc/xmlrpc_c.cc +++ b/src/rpc/xmlrpc_c.cc @@ -44,10 +44,9 @@ xmlrpc_list_entry_to_object(xmlrpc_env* env, xmlrpc_value* src, int index) { if (env->fault_occurred) throw xmlrpc_error_c(env); - torrent::Object obj = xmlrpc_to_object(env, tmp); - xmlrpc_DECREF(tmp); + utils::scope_guard guard([tmp]() { xmlrpc_DECREF(tmp); }); - return obj; + return xmlrpc_to_object(env, tmp); } int64_t @@ -213,11 +212,11 @@ xmlrpc_to_object(xmlrpc_env* env, xmlrpc_value* value, int call_type, rpc::targe if (env->fault_occurred) throw xmlrpc_error_c(env); + utils::scope_guard guard([tmp]() { xmlrpc_DECREF(tmp); }); + if (target != nullptr) std::tie(*target, *deleter) = xmlrpc_to_target(env, tmp, call_type); - xmlrpc_DECREF(tmp); - if (env->fault_occurred) throw xmlrpc_error_c(env);