diff options
| author | Heiko Schocher <hs@denx.de> | 2011-05-02 21:33:49 +0000 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2011-05-12 21:07:06 +0200 | 
| commit | a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986 (patch) | |
| tree | 8c580f588e2c88fa22e6115f316603c1d30627ce | |
| parent | f0c0b3a9e6f28a34d6da5edabba1e874fdf8e675 (diff) | |
| download | olio-uboot-2014.01-a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986.tar.xz olio-uboot-2014.01-a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986.zip | |
lib, vsprintf: introduce strict_strtoul
as checkpatch proposes to use strict_strtoul instead of
simple_strtoul, introduce it.
Ported this function from Linux 2.6.38 commit ID:
521cb40b0c44418a4fd36dc633f575813d59a43d
Signed-off-by: Heiko Schocher <hs@denx.de>
cc: Wolfgang Denk <wd@denx.de>
cc: Detlev Zundel <dzu@denx.de>
cc: Valentin Longchamp <valentin.longchamp@keymile.com>
cc: Holger Brunck <holger.brunck@keymile.com>
Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
| -rw-r--r-- | include/_exports.h | 1 | ||||
| -rw-r--r-- | include/common.h | 1 | ||||
| -rw-r--r-- | include/exports.h | 1 | ||||
| -rw-r--r-- | lib/vsprintf.c | 51 | 
4 files changed, 54 insertions, 0 deletions
| diff --git a/include/_exports.h b/include/_exports.h index d89b65be6..349a3c552 100644 --- a/include/_exports.h +++ b/include/_exports.h @@ -19,6 +19,7 @@ EXPORT_FUNC(do_reset)  EXPORT_FUNC(getenv)  EXPORT_FUNC(setenv)  EXPORT_FUNC(simple_strtoul) +EXPORT_FUNC(strict_strtoul)  EXPORT_FUNC(simple_strtol)  EXPORT_FUNC(strcmp)  EXPORT_FUNC(i2c_write) diff --git a/include/common.h b/include/common.h index 00e266ed6..1e4a6a575 100644 --- a/include/common.h +++ b/include/common.h @@ -650,6 +650,7 @@ void	udelay        (unsigned long);  /* lib/vsprintf.c */  ulong	simple_strtoul(const char *cp,char **endp,unsigned int base); +int strict_strtoul(const char *cp, unsigned int base, unsigned long *res);  unsigned long long	simple_strtoull(const char *cp,char **endp,unsigned int base);  long	simple_strtol(const char *cp,char **endp,unsigned int base);  void	panic(const char *fmt, ...) diff --git a/include/exports.h b/include/exports.h index ddd1bf494..e14d727ed 100644 --- a/include/exports.h +++ b/include/exports.h @@ -20,6 +20,7 @@ void __udelay(unsigned long);  unsigned long get_timer(unsigned long);  int vprintf(const char *, va_list);  unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base); +int strict_strtoul(const char *cp, unsigned int base, unsigned long *res);  char *getenv (char *name);  int setenv (char *varname, char *varvalue);  long simple_strtol(const char *cp,char **endp,unsigned int base); diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 61e6f0d2b..3b924ec5e 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -13,6 +13,7 @@  #include <linux/types.h>  #include <linux/string.h>  #include <linux/ctype.h> +#include <errno.h>  #include <common.h>  #if !defined (CONFIG_PANIC_HANG) @@ -61,6 +62,56 @@ unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)  	return result;  } +/** + * strict_strtoul - convert a string to an unsigned long strictly + * @cp: The string to be converted + * @base: The number base to use + * @res: The converted result value + * + * strict_strtoul converts a string to an unsigned long only if the + * string is really an unsigned long string, any string containing + * any invalid char at the tail will be rejected and -EINVAL is returned, + * only a newline char at the tail is acceptible because people generally + * change a module parameter in the following way: + * + *      echo 1024 > /sys/module/e1000/parameters/copybreak + * + * echo will append a newline to the tail. + * + * It returns 0 if conversion is successful and *res is set to the converted + * value, otherwise it returns -EINVAL and *res is set to 0. + * + * simple_strtoul just ignores the successive invalid characters and + * return the converted value of prefix part of the string. + * + * Copied this function from Linux 2.6.38 commit ID: + * 521cb40b0c44418a4fd36dc633f575813d59a43d + * + */ +int strict_strtoul(const char *cp, unsigned int base, unsigned long *res) +{ +	char *tail; +	unsigned long val; +	size_t len; + +	*res = 0; +	len = strlen(cp); +	if (len == 0) +		return -EINVAL; + +	val = simple_strtoul(cp, &tail, base); +	if (tail == cp) +		return -EINVAL; + +	if ((*tail == '\0') || +		((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) { +		*res = val; +		return 0; +	} + +	return -EINVAL; +} +  long simple_strtol(const char *cp,char **endp,unsigned int base)  {  	if(*cp=='-') |