Re: kstrtox: convert net/sunrpc/

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

 



On Mar 31, 2011, at 5:36 PM, Alexey Dobriyan wrote:

> * fix a bug in rpc_parse_scope_id() where successfull parsing of
>  scope ID was an error.

What was the bad behavior?

This looks a little bigger than just a fix to rpc_parse_scope_id().  Perhaps it should be split.

>  I'm not sure whether ID=0 should be banned, though.
> 
> Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx>
> ---
> 
> net/sunrpc/addr.c     |   20 ++++++++------------
> net/sunrpc/auth.c     |   15 ++++++---------
> net/sunrpc/xprtsock.c |    8 +++++---
> 3 files changed, 19 insertions(+), 24 deletions(-)
> 
> --- a/net/sunrpc/addr.c
> +++ b/net/sunrpc/addr.c
> @@ -173,15 +173,15 @@ static int rpc_parse_scope_id(const char *buf, const size_t buflen,
> 	len = (buf + buflen) - delim - 1;
> 	p = kstrndup(delim + 1, len, GFP_KERNEL);
> 	if (p) {
> -		unsigned long scope_id = 0;
> 		struct net_device *dev;
> +		u32 scope_id;
> 
> 		dev = dev_get_by_name(&init_net, p);
> 		if (dev != NULL) {
> 			scope_id = dev->ifindex;
> 			dev_put(dev);
> 		} else {
> -			if (strict_strtoul(p, 10, &scope_id) == 0) {
> +			if (kstrtou32(p, 10, &scope_id) < 0) {
> 				kfree(p);
> 				return 0;
> 			}
> @@ -299,7 +299,7 @@ EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr);
>  * @sap: buffer into which to plant socket address
>  * @salen: size of buffer
>  *
> - * @uaddr does not have to be '\0'-terminated, but strict_strtoul() and
> + * @uaddr does not have to be '\0'-terminated, but kstrto*() and
>  * rpc_pton() require proper string termination to be successful.
>  *
>  * Returns the size of the socket address if successful; otherwise
> @@ -309,8 +309,8 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len,
> 			  struct sockaddr *sap, const size_t salen)
> {
> 	char *c, buf[RPCBIND_MAXUADDRLEN + sizeof('\0')];
> -	unsigned long portlo, porthi;
> -	unsigned short port;
> +	u8 portlo, porthi;
> +	u16 port;
> 
> 	if (uaddr_len > RPCBIND_MAXUADDRLEN)
> 		return 0;
> @@ -321,21 +321,17 @@ size_t rpc_uaddr2sockaddr(const char *uaddr, const size_t uaddr_len,
> 	c = strrchr(buf, '.');
> 	if (unlikely(c == NULL))
> 		return 0;
> -	if (unlikely(strict_strtoul(c + 1, 10, &portlo) != 0))
> -		return 0;
> -	if (unlikely(portlo > 255))
> +	if (unlikely(kstrtou8(c + 1, 10, &portlo) != 0))
> 		return 0;
> 
> 	*c = '\0';
> 	c = strrchr(buf, '.');
> 	if (unlikely(c == NULL))
> 		return 0;
> -	if (unlikely(strict_strtoul(c + 1, 10, &porthi) != 0))
> -		return 0;
> -	if (unlikely(porthi > 255))
> +	if (unlikely(kstrtou8(c + 1, 10, &porthi) != 0))
> 		return 0;
> 
> -	port = (unsigned short)((porthi << 8) | portlo);
> +	port = (porthi << 8) | portlo;
> 
> 	*c = '\0';
> 	if (rpc_pton(buf, strlen(buf), sap, salen) == 0)
> --- a/net/sunrpc/auth.c
> +++ b/net/sunrpc/auth.c
> @@ -41,24 +41,21 @@ static unsigned long number_cred_unused;
> #define MAX_HASHTABLE_BITS (14)
> static int param_set_hashtbl_sz(const char *val, const struct kernel_param *kp)
> {
> -	unsigned long num;
> -	unsigned int nbits;
> +	unsigned int num, nbits;
> 	int ret;
> 
> 	if (!val)
> -		goto out_inval;
> -	ret = strict_strtoul(val, 0, &num);
> -	if (ret == -EINVAL)
> -		goto out_inval;
> +		return -EINVAL;
> +	ret = kstrtouint(val, 0, &num);
> +	if (ret < 0)
> +		return ret;
> 	nbits = fls(num);
> 	if (num > (1U << nbits))
> 		nbits++;
> 	if (nbits > MAX_HASHTABLE_BITS || nbits < 2)
> -		goto out_inval;
> +		return -EINVAL;
> 	*(unsigned int *)kp->arg = nbits;
> 	return 0;
> -out_inval:
> -	return -EINVAL;
> }
> 
> static int param_get_hashtbl_sz(char *buffer, const struct kernel_param *kp)
> --- a/net/sunrpc/xprtsock.c
> +++ b/net/sunrpc/xprtsock.c
> @@ -2502,13 +2502,15 @@ static int param_set_uint_minmax(const char *val,
> 		const struct kernel_param *kp,
> 		unsigned int min, unsigned int max)
> {
> -	unsigned long num;
> +	unsigned int num;
> 	int ret;
> 
> 	if (!val)
> 		return -EINVAL;
> -	ret = strict_strtoul(val, 0, &num);
> -	if (ret == -EINVAL || num < min || num > max)
> +	ret = kstrtouint(val, 0, &num);
> +	if (ret < 0)
> +		return ret;
> +	if (num < min || num > max)
> 		return -EINVAL;
> 	*((unsigned int *)kp->arg) = num;
> 	return 0;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




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


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux