Patch "ipmi: fix memleak when unload ipmi driver" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipmi: fix memleak when unload ipmi driver

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipmi-fix-memleak-when-unload-ipmi-driver.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 770ad66659173f5e84b904cabc881565b0438825
Author: Zhang Yuchen <zhangyuchen.lcr@xxxxxxxxxxxxx>
Date:   Fri Oct 7 17:26:17 2022 +0800

    ipmi: fix memleak when unload ipmi driver
    
    [ Upstream commit 36992eb6b9b83f7f9cdc8e74fb5799d7b52e83e9 ]
    
    After the IPMI disconnect problem, the memory kept rising and we tried
    to unload the driver to free the memory. However, only part of the
    free memory is recovered after the driver is uninstalled. Using
    ebpf to hook free functions, we find that neither ipmi_user nor
    ipmi_smi_msg is free, only ipmi_recv_msg is free.
    
    We find that the deliver_smi_err_response call in clean_smi_msgs does
    the destroy processing on each message from the xmit_msg queue without
    checking the return value and free ipmi_smi_msg.
    
    deliver_smi_err_response is called only at this location. Adding the
    free handling has no effect.
    
    To verify, try using ebpf to trace the free function.
    
      $ bpftrace -e 'kretprobe:ipmi_alloc_recv_msg {printf("alloc rcv
          %p\n",retval);} kprobe:free_recv_msg {printf("free recv %p\n",
          arg0)} kretprobe:ipmi_alloc_smi_msg {printf("alloc smi %p\n",
            retval);} kprobe:free_smi_msg {printf("free smi  %p\n",arg0)}'
    
    Signed-off-by: Zhang Yuchen <zhangyuchen.lcr@xxxxxxxxxxxxx>
    Message-Id: <20221007092617.87597-4-zhangyuchen.lcr@xxxxxxxxxxxxx>
    [Fixed the comment above handle_one_recv_msg().]
    Signed-off-by: Corey Minyard <cminyard@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index 703433493c85..c9e32d100b7e 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -3710,12 +3710,16 @@ static void deliver_smi_err_response(struct ipmi_smi *intf,
 				     struct ipmi_smi_msg *msg,
 				     unsigned char err)
 {
+	int rv;
 	msg->rsp[0] = msg->data[0] | 4;
 	msg->rsp[1] = msg->data[1];
 	msg->rsp[2] = err;
 	msg->rsp_size = 3;
-	/* It's an error, so it will never requeue, no need to check return. */
-	handle_one_recv_msg(intf, msg);
+
+	/* This will never requeue, but it may ask us to free the message. */
+	rv = handle_one_recv_msg(intf, msg);
+	if (rv == 0)
+		ipmi_free_smi_msg(msg);
 }
 
 static void cleanup_smi_msgs(struct ipmi_smi *intf)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux