[CRIU] [PATCH v3 1/2] util: xatol() and xatoi() helpers introduced
Stanislav Kinsburskiy
skinsbursky at virtuozzo.com
Wed Sep 27 12:22:18 MSK 2017
These helpers are safe versions of atol() and atoi() respectively.
And they check for overflow and NAN errors
v3:
1) Added string print to convertion error message in xatol_base()
2) Added check for INT range in xatoi()
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
---
criu/include/util.h | 3 +++
criu/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 48 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..28fc804 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -58,6 +58,51 @@
#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 '%s'", 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)
+ return err;
+
+ if (tmp > INT_MAX || tmp < INT_MIN) {
+ pr_err("value %#lx (%ld) is out of int range\n", tmp, tmp);
+ return -ERANGE;
+ }
+
+ *number = (int)tmp;
+ return 0;
+}
+
/*
* This function reallocates passed str pointer.
* It means:
More information about the CRIU
mailing list