Re: [PATCH] cifs: fix handling of escaped ',' in the password mount argument

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

 



added cc: stable # 5.11 and pushed into cifs-2.6 for-next

On Thu, Feb 25, 2021 at 1:36 AM Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote:
>
> Passwords can contain ',' which are also used as the separator between
> mount options. Mount.cifs will escape all ',' characters as the string ",,".
> Update parsing of the mount options to detect ",," and treat it as a single
> 'c' character.
>
> Fixes: 24e0a1eff9e2 ("cifs: switch to new mount api")
> Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
> ---
>  fs/cifs/fs_context.c | 43 ++++++++++++++++++++++++++++++-------------
>  1 file changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/fs/cifs/fs_context.c b/fs/cifs/fs_context.c
> index 14c955a30006..892f51a21278 100644
> --- a/fs/cifs/fs_context.c
> +++ b/fs/cifs/fs_context.c
> @@ -544,20 +544,37 @@ static int smb3_fs_context_parse_monolithic(struct fs_context *fc,
>
>         /* BB Need to add support for sep= here TBD */
>         while ((key = strsep(&options, ",")) != NULL) {
> -               if (*key) {
> -                       size_t v_len = 0;
> -                       char *value = strchr(key, '=');
> -
> -                       if (value) {
> -                               if (value == key)
> -                                       continue;
> -                               *value++ = 0;
> -                               v_len = strlen(value);
> -                       }
> -                       ret = vfs_parse_fs_string(fc, key, value, v_len);
> -                       if (ret < 0)
> -                               break;
> +               size_t len;
> +               char *value;
> +
> +               if (*key == 0)
> +                       break;
> +
> +               /* Check if following character is the deliminator If yes,
> +                * we have encountered a double deliminator reset the NULL
> +                * character to the deliminator
> +                */
> +               while (options && options[0] == ',') {
> +                       len = strlen(key);
> +                       strcpy(key + len, options);
> +                       options = strchr(options, ',');
> +                       if (options)
> +                               *options++ = 0;
>                 }
> +
> +
> +               len = 0;
> +               value = strchr(key, '=');
> +               if (value) {
> +                       if (value == key)
> +                               continue;
> +                       *value++ = 0;
> +                       len = strlen(value);
> +               }
> +
> +               ret = vfs_parse_fs_string(fc, key, value, len);
> +               if (ret < 0)
> +                       break;
>         }
>
>         return ret;
> --
> 2.13.6
>


-- 
Thanks,

Steve



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

  Powered by Linux