[PATCH 1/3] str_to_val macro, improved conversion and checking of numerical args

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

 



When a numerical command line param value is out of range or contains
garbage (both tgtd and tgtadm), this remains unchecked in many cases.
In some of them 0 value will be used, which may lead to unpredicted or
"silently" faulty behavior.

This fix defines a new macro str_to_val() which uses strtoull() and
detects its errors properly, by checking
1) errno (range errors) and 2) comparing endptr to the original argument
(they remain equal in case of non-numerical garbage);
created

Signed-off-by: Alexander Nezhinsky <alexandern@xxxxxxxxxxxx>
---
 usr/util.h |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/usr/util.h b/usr/util.h
index d4e9406..d362903 100644
--- a/usr/util.h
+++ b/usr/util.h
@@ -8,6 +8,7 @@
 #include <signal.h>
 #include <syscall.h>
 #include <unistd.h>
+#include <limits.h>
 #include <linux/types.h>
 
 #include "be_byteshift.h"
@@ -138,4 +139,22 @@ struct signalfd_siginfo {
 };
 #endif
 
+#define str_to_val(str, name, val, minv, maxv)		\
+({							\
+	char *ptr;					\
+	int ret = 0;					\
+	val = (typeof(val)) strtoull(str, &ptr, 0);	\
+	if (errno || ptr == str) {			\
+		eprintf("%s value '%s' invalid\n",	\
+			name ? name : "", str);		\
+		ret = EINVAL;				\
+	}						\
+	else if (val < minv || val > maxv) {		\
+		eprintf("%s value '%s' out of range\n",	\
+			name ? name : "", str);		\
+		ret = ERANGE;				\
+	}						\
+	ret;						\
+})
+
 #endif
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux