[linux-cifs-client] [PATCH 1/2] cifs: Rename cifs_strncpy_to_host and fix buffer size

Jeff Layton jlayton at redhat.com
Mon Apr 20 15:30:25 GMT 2009


On Mon, 20 Apr 2009 18:54:21 +0530
Suresh Jayaraman <sjayaraman at suse.de> wrote:

> There is a possibility for the path_name and node_name buffers to
> overflow if they contain charcters that are >2 bytes in the local
> charset. Resize the buffer allocation so to avoid this possibility.
> 
> Also, as pointed out by Jeff Layton, it would be appropriate to
> rename the function to cifs_strlcpy_to_host to reflect the fact
> that the copied string is always NULL terminated.
> 
> 
> Signed-off-by: Suresh Jayaraman <sjayaraman at suse.de>
> ---
>  fs/cifs/cifssmb.c |   20 ++++++++++----------
>  1 files changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> index a0845dc..a02c43b 100644
> --- a/fs/cifs/cifssmb.c
> +++ b/fs/cifs/cifssmb.c
> @@ -88,29 +88,29 @@ static struct {
>   *	on failure - errno
>   */
>  static int
> -cifs_strncpy_to_host(char **dst, const char *src, const int maxlen,
> +cifs_strlcpy_to_host(char **dst, const char *src, const int maxlen,
>  		 const bool is_unicode, const struct nls_table *nls_codepage)
>  {
>  	int plen;
>  
>  	if (is_unicode) {
>  		plen = UniStrnlen((wchar_t *)src, maxlen);
> -		*dst = kmalloc(plen + 2, GFP_KERNEL);
> +		*dst = kmalloc((4 * plen) + 2, GFP_KERNEL);
>  		if (!*dst)
> -			goto cifs_strncpy_to_host_ErrExit;
> +			goto cifs_strlcpy_to_host_ErrExit;
>  		cifs_strfromUCS_le(*dst, (__le16 *)src, plen, nls_codepage);
> +		(*dst)[plen] = 0;
> +		(*dst)[plen+1] = 0; /* needed for Unicode */
>  	} else {
>  		plen = strnlen(src, maxlen);
>  		*dst = kmalloc(plen + 2, GFP_KERNEL);
>  		if (!*dst)
> -			goto cifs_strncpy_to_host_ErrExit;
> -		strncpy(*dst, src, plen);
> +			goto cifs_strlcpy_to_host_ErrExit;
> +		strlcpy(*dst, src, plen);
>  	}
> -	(*dst)[plen] = 0;
> -	(*dst)[plen+1] = 0; /* harmless for ASCII case, needed for Unicode */
>  	return 0;
>  
> -cifs_strncpy_to_host_ErrExit:
> +cifs_strlcpy_to_host_ErrExit:
>  	cERROR(1, ("Failed to allocate buffer for string\n"));
>  	return -ENOMEM;
>  }
> @@ -4029,7 +4029,7 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
>  		/* copy DfsPath */
>  		temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset);
>  		max_len = data_end - temp;
> -		rc = cifs_strncpy_to_host(&(node->path_name), temp,
> +		rc = cifs_strlcpy_to_host(&(node->path_name), temp,
>  					max_len, is_unicode, nls_codepage);
>  		if (rc)
>  			goto parse_DFS_referrals_exit;
> @@ -4037,7 +4037,7 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
>  		/* copy link target UNC */
>  		temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset);
>  		max_len = data_end - temp;
> -		rc = cifs_strncpy_to_host(&(node->node_name), temp,
> +		rc = cifs_strlcpy_to_host(&(node->node_name), temp,
>  					max_len, is_unicode, nls_codepage);
>  		if (rc)
>  			goto parse_DFS_referrals_exit;
> _______________________________________________
> linux-cifs-client mailing list
> linux-cifs-client at lists.samba.org
> https://lists.samba.org/mailman/listinfo/linux-cifs-client
> 

Acked-by: Jeff Layton <jlayton at redhat.com>


More information about the linux-cifs-client mailing list