On Mon, Feb 28, 2011 at 12:59 PM, Jeff Layton <[email protected]> wrote:
> On Fri, 25 Feb 2011 12:24:17 -0600
> Steve French <[email protected]> wrote:
>
>> commit 355e57ca063338eb00ea067a7570bb5f136cc513
>> Author: Steve French <[email protected]>
>> Date:   Fri Feb 25 01:11:56 2011 -0600
>>
>>     [CIFS] Allow user names longer than 32 bytes
>>
>>     We artificially limited the user name to 32 bytes, but modern servers 
>> handle
>>     larger.  Set the maximum length to a reasonable 256, and make the user 
>> name
>>     string dynamically allocated rather than a fixed size in session 
>> structure.
>>     Also clean up old checkpatch warning.
>>
>>     Signed-off-by: Steve French <[email protected]>
>
> [...]
>
>> diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
>> index a51585f..e307a28 100644
>> --- a/fs/cifs/cifsencrypt.c
>> +++ b/fs/cifs/cifsencrypt.c
>> @@ -469,15 +469,15 @@ static int calc_ntlmv2_hash(struct cifsSesInfo
>> *ses, char *ntlmv2_hash,
>>               return rc;
>>       }
>>
>> -     /* convert ses->userName to unicode and uppercase */
>> -     len = strlen(ses->userName);
>> +     /* convert ses->user_name to unicode and uppercase */
>> +     len = strlen(ses->user_name);
>>       user = kmalloc(2 + (len * 2), GFP_KERNEL);
>>       if (user == NULL) {
>>               cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n");
>>               rc = -ENOMEM;
>>               goto calc_exit_2;
>>       }
>> -     len = cifs_strtoUCS((__le16 *)user, ses->userName, len, nls_cp);
>> +     len = cifs_strtoUCS((__le16 *)user, ses->user_name, len, nls_cp);
>>       UniStrupr(user);
>>
>
> Now that user_name can be a NULL pointer, what prevents the code above
> from oopsing if no one passes in a user= parm?
>
> --
> Jeff Layton <[email protected]>
>

In cifs_mount in fs/cifs/connect.c we guarantee that
volume_info->username is filled in (or we exit mount)

        if (volume_info->nullauth) {
                cFYI(1, "null user");
                volume_info->username = "";
        } else if (volume_info->username) {
                /* BB fixme parse for domain name here */
                cFYI(1, "Username: %s", volume_info->username);
        } else {
                cifserror("No username specified");
        /* In userspace mount helper we can get user name from alternate
           locations such as env variables and files on disk */
                rc = -EINVAL;
                goto out;
        }

then in get_smb_ses (see below) when we allocate a new session we
either kstrdup successfully or we fail the mount:
        if (volume_info->username) {
                ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
                if (!ses->user_name)
                        goto get_ses_fail;
        }


I don't mind adding defensive code in other places, but the reason the
null check is (only) in the find_cifs_smb_ses is in case an invalid
ses (being freed) was on the list.
-- 
Thanks,

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

Reply via email to