OSDN Git Service

gfs2: Fix error path kobject memory leak
authorTobin C. Harding <tobin@kernel.org>
Mon, 13 May 2019 19:59:04 +0000 (21:59 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 May 2019 22:43:01 +0000 (15:43 -0700)
If a call to kobject_init_and_add() fails we must call kobject_put()
otherwise we leak memory.

Function gfs2_sys_fs_add always calls kobject_init_and_add() which
always calls kobject_init().

It is safe to leave object destruction up to the kobject release
function and never free it manually.

Remove call to kfree() and always call kobject_put() in the error path.

Signed-off-by: Tobin C. Harding <tobin@kernel.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/gfs2/sys.c

index 1787d29..08e4996 100644 (file)
@@ -650,7 +650,6 @@ int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
        char ro[20];
        char spectator[20];
        char *envp[] = { ro, spectator, NULL };
-       int sysfs_frees_sdp = 0;
 
        sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
        sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
@@ -661,8 +660,6 @@ int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
        if (error)
                goto fail_reg;
 
-       sysfs_frees_sdp = 1; /* Freeing sdp is now done by sysfs calling
-                               function gfs2_sbd_release. */
        error = sysfs_create_group(&sdp->sd_kobj, &tune_group);
        if (error)
                goto fail_reg;
@@ -687,10 +684,7 @@ fail_tune:
 fail_reg:
        free_percpu(sdp->sd_lkstats);
        fs_err(sdp, "error %d adding sysfs files\n", error);
-       if (sysfs_frees_sdp)
-               kobject_put(&sdp->sd_kobj);
-       else
-               kfree(sdp);
+       kobject_put(&sdp->sd_kobj);
        sb->s_fs_info = NULL;
        return error;
 }