lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.11 744/775] cifs: fix handling of escaped , in the password mount argument
    Date
    From: Ronnie Sahlberg <lsahlber@redhat.com>

    commit d08395a3f2f473c6ceeb316a1aeb7fad5b43014f upstream.

    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")
    Cc: stable@vger.kernel.org # 5.11
    Reported-by: Simon Taylor <simon@simon-taylor.me.uk>
    Tested-by: Simon Taylor <simon@simon-taylor.me.uk>
    Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/cifs/fs_context.c | 43 ++++++++++++++++++++++++++++++-------------
    1 file changed, 30 insertions(+), 13 deletions(-)

    --- a/fs/cifs/fs_context.c
    +++ b/fs/cifs/fs_context.c
    @@ -542,20 +542,37 @@ static int smb3_fs_context_parse_monolit

    /* 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;

    \
     
     \ /
      Last update: 2021-03-02 14:40    [W:2.327 / U:1.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site