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

Stanislav Kinsburskiy skinsbursky at virtuozzo.com
Wed Sep 13 14:30:24 MSK 2017


These helpers are safe versions of atol() and atoi() respectively.
And they check for overflow and NAN errors

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

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:



More information about the CRIU mailing list