[1/2] util: xatol() and xatoi() helpers introduced

Submitted by Stanislav Kinsburskiy on Sept. 13, 2017, 11:30 a.m.

Details

Message ID 20170913113024.48169.90970.stgit@skinsbursky-vz7.qa.sw.ru
State New
Series "autofs: fix "pipe_ino" option parsing"
Headers show

Commit Message

Stanislav Kinsburskiy Sept. 13, 2017, 11:30 a.m.
These helpers are safe versions of atol() and atoi() respectively.
And they check for overflow and NAN errors

Signed-off-by: Stanislav Kinsburskiy <skinsbursky@virtuozzo.com>
---
 criu/include/util.h |    3 +++
 criu/util.c         |   38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

Patch hide | download patch | download mbox

diff --git a/criu/include/util.h b/criu/include/util.h
index 1fc20db..20684cc 100644
--- a/criu/include/util.h
+++ b/criu/include/util.h
@@ -280,6 +280,9 @@  void tcp_cork(int sk, bool on);
 
 const char *ns_to_string(unsigned int ns);
 
+int xatol(const char *string, long *number);
+int xatoi(const char *string, int *number);
+
 char *xstrcat(char *str, const char *fmt, ...)
 	__attribute__ ((__format__ (__printf__, 2, 3)));
 char *xsprintf(const char *fmt, ...)
diff --git a/criu/util.c b/criu/util.c
index b5a161f..7d60617 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -58,6 +58,44 @@ 
 
 #define VMA_OPT_LEN	128
 
+static int xatol_base(const char *string, long *number, int base)
+{
+	char *endptr;
+	long nr;
+
+	errno = 0;
+	nr = strtol(string, &endptr, base);
+	if ((errno == ERANGE && (nr == LONG_MAX || nr == LONG_MIN))
+			|| (errno != 0 && nr == 0)) {
+		pr_perror("failed to convert string");
+		return -EINVAL;
+	}
+
+	if ((endptr == string) || (*endptr != '\0')) {
+		pr_err("String is not a number: '%s'\n", string);
+		return -EINVAL;
+	}
+	*number = nr;
+	return 0;
+}
+
+int xatol(const char *string, long *number)
+{
+	return xatol_base(string, number, 10);
+}
+
+
+int xatoi(const char *string, int *number)
+{
+	long tmp;
+	int err;
+
+	err = xatol(string, &tmp);
+	if (!err)
+		*number = (int)tmp;
+	return err;
+}
+
 /*
  * This function reallocates passed str pointer.
  * It means: