diff mbox

[U-Boot,v2] lib, vsprintf: introduce strict_strtoul

Message ID 1304408029-16785-1-git-send-email-hs@denx.de
State Accepted
Commit a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986
Headers show

Commit Message

Heiko Schocher May 3, 2011, 7:33 a.m. UTC
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>
---
changes for v2:
- added origin source for this new function, as Wolfgang
  Denk suggested.
- Patch no longer in the patchserie, as it is an independent
  change.

 include/_exports.h |    1 +
 include/common.h   |    1 +
 include/exports.h  |    1 +
 lib/vsprintf.c     |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+), 0 deletions(-)

Comments

Wolfgang Denk May 12, 2011, 7:07 p.m. UTC | #1
Dear Heiko Schocher,

In message <1304408029-16785-1-git-send-email-hs@denx.de> you wrote:
> 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>
> ---
> changes for v2:
> - added origin source for this new function, as Wolfgang
>   Denk suggested.
> - Patch no longer in the patchserie, as it is an independent
>   change.
> 
>  include/_exports.h |    1 +
>  include/common.h   |    1 +
>  include/exports.h  |    1 +
>  lib/vsprintf.c     |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 54 insertions(+), 0 deletions(-)

Appplied, thanks.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/include/_exports.h b/include/_exports.h
index d89b65b..349a3c5 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 00e266e..1e4a6a5 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 ddd1bf4..e14d727 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 61e6f0d..3b924ec 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=='-')