]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
debugfs: Return error during {full/open}_proxy_open() on rmmod
authorSven Eckelmann <sven@narfation.org>
Mon, 2 Aug 2021 16:24:44 +0000 (18:24 +0200)
committerKelsey Skunberg <kelsey.skunberg@canonical.com>
Mon, 11 Oct 2021 23:08:48 +0000 (17:08 -0600)
BugLink: https://bugs.launchpad.net/bugs/1946024
[ Upstream commit 112cedc8e600b668688eb809bf11817adec58ddc ]

If a kernel module gets unloaded then it printed report about a leak before
commit 275678e7a9be ("debugfs: Check module state before warning in
{full/open}_proxy_open()"). An additional check was added in this commit to
avoid this printing. But it was forgotten that the function must return an
error in this case because it was not actually opened.

As result, the systems started to crash or to hang when a module was
unloaded while something was trying to open a file.

Fixes: 275678e7a9be ("debugfs: Check module state before warning in {full/open}_proxy_open()")
Cc: Taehee Yoo <ap420073@gmail.com>
Reported-by: Mário Lopes <ml@simonwunderlich.de>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Link: https://lore.kernel.org/r/20210802162444.7848-1-sven@narfation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
fs/debugfs/file.c

index 943637298f650653ad7f1cd36ff1839e30c8e195..a32c5c7dcfd897f68cc14c7851a3d90ba78a2230 100644 (file)
@@ -178,8 +178,10 @@ static int open_proxy_open(struct inode *inode, struct file *filp)
        if (!fops_get(real_fops)) {
 #ifdef CONFIG_MODULES
                if (real_fops->owner &&
-                   real_fops->owner->state == MODULE_STATE_GOING)
+                   real_fops->owner->state == MODULE_STATE_GOING) {
+                       r = -ENXIO;
                        goto out;
+               }
 #endif
 
                /* Huh? Module did not clean up after itself at exit? */
@@ -313,8 +315,10 @@ static int full_proxy_open(struct inode *inode, struct file *filp)
        if (!fops_get(real_fops)) {
 #ifdef CONFIG_MODULES
                if (real_fops->owner &&
-                   real_fops->owner->state == MODULE_STATE_GOING)
+                   real_fops->owner->state == MODULE_STATE_GOING) {
+                       r = -ENXIO;
                        goto out;
+               }
 #endif
 
                /* Huh? Module did not cleanup after itself at exit? */