Skip to content

Commit ff78ed1

Browse files
Mani-Sadhasivamgregkh
authored andcommitted
net: qrtr: ns: Free the node during ctrl_cmd_bye()
commit 68efba3 upstream. A node sends the BYE packet when it is about to go down. So the nameserver should advertise the removal of the node to all remote and local observers and free the node finally. But currently, the nameserver doesn't free the node memory even after processing the BYE packet. This causes the node memory to leak. Hence, remove the node from Xarray list and free the node memory during both success and failure case of ctrl_cmd_bye(). Cc: stable@vger.kernel.org Fixes: 0c2204a ("net: qrtr: Migrate nameservice to kernel from userspace") Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com> Link: https://patch.msgid.link/20260409-qrtr-fix-v3-3-00a8a5ff2b51@oss.qualcomm.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4069329 commit ff78ed1

1 file changed

Lines changed: 15 additions & 5 deletions

File tree

net/qrtr/ns.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
339339
struct qrtr_node *node;
340340
unsigned long index;
341341
struct kvec iv;
342-
int ret;
342+
int ret = 0;
343343

344344
iv.iov_base = &pkt;
345345
iv.iov_len = sizeof(pkt);
@@ -354,8 +354,10 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
354354

355355
/* Advertise the removal of this client to all local servers */
356356
local_node = node_get(qrtr_ns.local_node);
357-
if (!local_node)
358-
return 0;
357+
if (!local_node) {
358+
ret = 0;
359+
goto delete_node;
360+
}
359361

360362
memset(&pkt, 0, sizeof(pkt));
361363
pkt.cmd = cpu_to_le32(QRTR_TYPE_BYE);
@@ -372,10 +374,18 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from)
372374
ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
373375
if (ret < 0) {
374376
pr_err("failed to send bye cmd\n");
375-
return ret;
377+
goto delete_node;
376378
}
377379
}
378-
return 0;
380+
381+
/* Ignore -ENODEV */
382+
ret = 0;
383+
384+
delete_node:
385+
xa_erase(&nodes, from->sq_node);
386+
kfree(node);
387+
388+
return ret;
379389
}
380390

381391
static int ctrl_cmd_del_client(struct sockaddr_qrtr *from,

0 commit comments

Comments
 (0)