Re: [U-Boot] [PATCH 01/30] lib, vsprintf: introduce strict_strtoul

2011-04-29 Thread Wolfgang Denk
Dear Valentin Longchamp,

In message 
e0c1c0de6c89e3723ac3d1874ce4819a4a47c8f2.1302272395.git.valentin.longch...@keymile.com
 you wrote:
 From: Heiko Schocher h...@denx.de
 
 as checkpatch proposes to use strict_strtoul instead of
 simple_strtoul, introduce it.

Same comment as prvious version: please provide full reference /
attribution.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH, MD: Wolfgang Denk  Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
If I had to live my life again,  I'd  make  the  same  mistakes, only
sooner.  -- Tallulah Bankhead
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 01/30] lib, vsprintf: introduce strict_strtoul

2011-04-08 Thread Valentin Longchamp
From: Heiko Schocher h...@denx.de

as checkpatch proposes to use strict_strtoul instead of
simple_strtoul, introduce it.

Signed-off-by: Heiko Schocher h...@denx.de
cc: Wolfgang Denk w...@denx.de
cc: Detlev Zundel d...@denx.de
cc: Valentin Longchamp valentin.longch...@keymile.com
cc: Holger Brunck holger.bru...@keymile.com
Signed-off-by: Valentin Longchamp valentin.longch...@keymile.com
---
 include/_exports.h |1 +
 include/common.h   |1 +
 include/exports.h  |1 +
 lib/vsprintf.c |   47 +++
 4 files changed, 50 insertions(+), 0 deletions(-)

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 49c884c..d180da2 100644
--- a/include/common.h
+++ b/include/common.h
@@ -648,6 +648,7 @@ voidudelay(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 6382311..2f49cea 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..0eda799 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,52 @@ 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.
+ */
+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=='-')
-- 
1.7.0.5

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot