Re: [PATCH] cifs: remove any preceding delimiter from prefix_path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Merged into cifs-2.6.git

On Mon, Feb 8, 2016 at 2:14 AM, Sachin Prabhu <sprabhu@xxxxxxxxxx> wrote:
> We currently do not check if any delimiter exists before the prefix
> path in cifs_compose_mount_options(). Consequently when building the
> devname using cifs_build_devname() we can end up with multiple
> delimiters separating the UNC and the prefix path.
>
> An issue was reported by the customer mounting a folder within a DFS
> share from a Netapp server which uses McAfee antivirus. We have
> narrowed down the cause to the use of double backslashes in the file
> name used to open the file. This was determined to be caused because of
> additional delimiters as a result of the bug.
>
> In addition to changes in cifs_build_devname(), we also fix
> cifs_parse_devname() to ignore any preceding delimiter for the prefix
> path.
>
> The problem was originally reported on RHEL 6 in RHEL bz 1252721. This
> is the upstream version of the fix. The fix was confirmed by looking at
> the packet capture of a DFS mount.
>
> Signed-off-by: Sachin Prabhu <sprabhu@xxxxxxxxxx>
> ---
>  fs/cifs/cifs_dfs_ref.c | 6 +++++-
>  fs/cifs/connect.c      | 8 ++++++--
>  2 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
> index 7dc886c..10db1fe 100644
> --- a/fs/cifs/cifs_dfs_ref.c
> +++ b/fs/cifs/cifs_dfs_ref.c
> @@ -151,8 +151,12 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
>         if (sb_mountdata == NULL)
>                 return ERR_PTR(-EINVAL);
>
> -       if (strlen(fullpath) - ref->path_consumed)
> +       if (strlen(fullpath) - ref->path_consumed) {
>                 prepath = fullpath + ref->path_consumed;
> +               /* skip initial delimiter */
> +               if (*prepath == '/' || *prepath == '\\')
> +                       prepath++;
> +       }
>
>         *devname = cifs_build_devname(ref->node_name, prepath);
>         if (IS_ERR(*devname)) {
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 4fbd92d..2acb4bb 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -1196,8 +1196,12 @@ cifs_parse_devname(const char *devname, struct smb_vol *vol)
>
>         convert_delimiter(vol->UNC, '\\');
>
> -       /* If pos is NULL, or is a bogus trailing delimiter then no prepath */
> -       if (!*pos++ || !*pos)
> +       /* skip any delimiter */
> +       if (*pos == '/' || *pos == '\\')
> +               pos++;
> +
> +       /* If pos is NULL then no prepath */
> +       if (!*pos)
>                 return 0;
>
>         vol->prepath = kstrdup(pos, GFP_KERNEL);
> --
> 2.5.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Thanks,

Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux