From 368952d6f99021bbad38c7f12925cd45d50e08bc Mon Sep 17 00:00:00 2001
From: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
Date: Fri, 18 Sep 2026 18:23:35 -0300
Subject: dcopclient: Remove failed calls from pending replies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

DCOPReplyWait keeps a ReplyStruct in pendingReplies until the delayed reply arrives.

The synchronous call wrapper now removes its stack-owned ReplyStruct before it goes out of scope. Async call failure cleanup removes the heap-owned ReplyStruct before it is deleted. The lower callInternal overload leaves pendingReplies ownership to its callers.

Signed-off-by: Sebastião Guerra <sebastiao.luiz.guerra@gmail.com>
---
 dcop/dcopclient.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/dcop/dcopclient.cpp b/dcop/dcopclient.cpp
index 1533b802c..196d3b336 100644
--- a/dcop/dcopclient.cpp
+++ b/dcop/dcopclient.cpp
@@ -1847,6 +1847,7 @@ int DCOPClient::callAsync(const TQCString &remApp, const TQCString &remObjId,
                           replyStruct, false, -1, DCOPCall);
     if (!b)
     {
+        d->pendingReplies.removeRef(replyStruct);
         delete replyStruct->replyType;
         delete replyStruct->replyData;
         delete replyStruct;
@@ -1871,7 +1872,10 @@ bool DCOPClient::callInternal(const TQCString &remApp, const TQCString &remObjId
     ReplyStruct replyStruct;
     replyStruct.replyType = &replyType;
     replyStruct.replyData = &replyData;
-    return callInternal(remApp, remObjId, remFun, data, &replyStruct, useEventLoop, timeout, minor_opcode);
+    bool result = callInternal(remApp, remObjId, remFun, data, &replyStruct,
+                               useEventLoop, timeout, minor_opcode);
+    d->pendingReplies.removeRef(&replyStruct);
+    return result;
 }
 
 bool DCOPClient::callInternal(const TQCString &remApp, const TQCString &remObjId,
-- 
cgit v1.2.3

