]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: gadget: f_subset: Fix unbalanced refcnt in geth_free
authorKuen-Han Tsai <khtsai@google.com>
Fri, 20 Mar 2026 08:54:44 +0000 (16:54 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 30 Mar 2026 15:19:29 +0000 (17:19 +0200)
geth_alloc() increments the reference count, but geth_free() fails to
decrement it. This prevents the configuration of attributes via configfs
after unlinking the function.

Decrement the reference count in geth_free() to ensure proper cleanup.

Fixes: 02832e56f88a ("usb: gadget: f_subset: add configfs support")
Cc: stable@vger.kernel.org
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
Link: https://patch.msgid.link/20260320-usb-net-lifecycle-v1-1-4886b578161b@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_subset.c

index 076072386e5e0d5029617ce232fc7978143131d4..74dc6da5c7674a222e754c95b7db9a9838605f00 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (C) 2008 Nokia Corporation
  */
 
+#include <linux/cleanup.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -449,8 +450,13 @@ static struct usb_function_instance *geth_alloc_inst(void)
 static void geth_free(struct usb_function *f)
 {
        struct f_gether *eth;
+       struct f_gether_opts *opts;
+
+       opts = container_of(f->fi, struct f_gether_opts, func_inst);
 
        eth = func_to_geth(f);
+       scoped_guard(mutex, &opts->lock)
+               opts->refcnt--;
        kfree(eth);
 }