lkml.org 
[lkml]   [2017]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 198/235] Fix memory leaks in cifs_do_mount()
    Date
    From: Sachin Prabhu <sprabhu@redhat.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 4214ebf4654798309364d0c678b799e402f38288 upstream.

    Fix memory leaks introduced by the patch
    Fs/cifs: make share unaccessible at root level mountable

    Also move allocation of cifs_sb->prepath to cifs_setup_cifs_sb().

    Signed-off-by: Sachin Prabhu <sprabhu@redhat.com>
    Tested-by: Aurelien Aptel <aaptel@suse.com>
    Signed-off-by: Steve French <smfrench@gmail.com>
    Acked-by: Aurelien Aptel <aaptel@suse.com>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    fs/cifs/cifsfs.c | 20 ++++++++------------
    fs/cifs/cifsproto.h | 2 +-
    fs/cifs/connect.c | 11 ++++++++++-
    3 files changed, 19 insertions(+), 14 deletions(-)

    diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
    index 259f95121151..846b9916fdcd 100644
    --- a/fs/cifs/cifsfs.c
    +++ b/fs/cifs/cifsfs.c
    @@ -665,26 +665,22 @@ cifs_do_mount(struct file_system_type *fs_type,
    cifs_sb->mountdata = kstrndup(data, PAGE_SIZE, GFP_KERNEL);
    if (cifs_sb->mountdata == NULL) {
    root = ERR_PTR(-ENOMEM);
    - goto out_cifs_sb;
    + goto out_free;
    }

    - if (volume_info->prepath) {
    - cifs_sb->prepath = kstrdup(volume_info->prepath, GFP_KERNEL);
    - if (cifs_sb->prepath == NULL) {
    - root = ERR_PTR(-ENOMEM);
    - goto out_cifs_sb;
    - }
    + rc = cifs_setup_cifs_sb(volume_info, cifs_sb);
    + if (rc) {
    + root = ERR_PTR(rc);
    + goto out_free;
    }

    - cifs_setup_cifs_sb(volume_info, cifs_sb);
    -
    rc = cifs_mount(cifs_sb, volume_info);
    if (rc) {
    if (!(flags & MS_SILENT))
    cifs_dbg(VFS, "cifs_mount failed w/return code = %d\n",
    rc);
    root = ERR_PTR(rc);
    - goto out_mountdata;
    + goto out_free;
    }

    mnt_data.vol = volume_info;
    @@ -731,9 +727,9 @@ out:
    cifs_cleanup_volume_info(volume_info);
    return root;

    -out_mountdata:
    +out_free:
    + kfree(cifs_sb->prepath);
    kfree(cifs_sb->mountdata);
    -out_cifs_sb:
    kfree(cifs_sb);
    out_nls:
    unload_nls(volume_info->local_nls);
    diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
    index 6421d8b433b1..44d825cdf85e 100644
    --- a/fs/cifs/cifsproto.h
    +++ b/fs/cifs/cifsproto.h
    @@ -179,7 +179,7 @@ extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf,
    extern int cifs_readv_from_socket(struct TCP_Server_Info *server,
    struct kvec *iov_orig, unsigned int nr_segs,
    unsigned int to_read);
    -extern void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
    +extern int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
    struct cifs_sb_info *cifs_sb);
    extern int cifs_match_super(struct super_block *, void *);
    extern void cifs_cleanup_volume_info(struct smb_vol *pvolume_info);
    diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
    index e4a36223d815..98c9c867f1b3 100644
    --- a/fs/cifs/connect.c
    +++ b/fs/cifs/connect.c
    @@ -3185,7 +3185,7 @@ void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon,
    }
    }

    -void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
    +int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
    struct cifs_sb_info *cifs_sb)
    {
    INIT_DELAYED_WORK(&cifs_sb->prune_tlinks, cifs_prune_tlinks);
    @@ -3267,6 +3267,15 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info,

    if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
    cifs_dbg(VFS, "mount option dynperm ignored if cifsacl mount option supported\n");
    +
    +
    + if (pvolume_info->prepath) {
    + cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
    + if (cifs_sb->prepath == NULL)
    + return -ENOMEM;
    + }
    +
    + return 0;
    }

    static void
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-01-27 12:31    [W:3.353 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site