]> git.hungrycats.org Git - linux/commitdiff
Fix memory leak in posix_clock_open()
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 26 Mar 2024 21:59:48 +0000 (14:59 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:11:42 +0000 (15:11 +0200)
commit 5b4cdd9c5676559b8a7c944ac5269b914b8c0bb8 upstream.

If the clk ops.open() function returns an error, we don't release the
pccontext we allocated for this clock.

Re-organize the code slightly to make it all more obvious.

Reported-by: Rohit Keshri <rkeshri@redhat.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Fixes: 60c6946675fc ("posix-clock: introduce posix_clock_context concept")
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Torvalds <torvalds@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/time/posix-clock.c

index 9de66bbbb3d1555603ad169fad883af1c55b9d85..4782edcbe7b9b445e932897ce97d799d73762154 100644 (file)
@@ -129,15 +129,17 @@ static int posix_clock_open(struct inode *inode, struct file *fp)
                goto out;
        }
        pccontext->clk = clk;
-       fp->private_data = pccontext;
-       if (clk->ops.open)
+       if (clk->ops.open) {
                err = clk->ops.open(pccontext, fp->f_mode);
-       else
-               err = 0;
-
-       if (!err) {
-               get_device(clk->dev);
+               if (err) {
+                       kfree(pccontext);
+                       goto out;
+               }
        }
+
+       fp->private_data = pccontext;
+       get_device(clk->dev);
+       err = 0;
 out:
        up_read(&clk->rwsem);
        return err;