diff options
author | Lukas Nykryn <lnykryn@redhat.com> | 2014-06-06 10:56:21 +0200 |
---|---|---|
committer | Lukas Nykryn <lnykryn@redhat.com> | 2014-09-09 14:35:02 +0200 |
commit | 821dfcde7d027a566c5af861ee3f127070e933cd (patch) | |
tree | 004b870fe3d6e862a93ae3c525f468c6b8074089 | |
parent | fbd19f7ca1653d7d27ef5bfcad606d12abdaeb89 (diff) | |
download | initscripts-821dfcde7d027a566c5af861ee3f127070e933cd.tar initscripts-821dfcde7d027a566c5af861ee3f127070e933cd.tar.gz initscripts-821dfcde7d027a566c5af861ee3f127070e933cd.tar.bz2 initscripts-821dfcde7d027a566c5af861ee3f127070e933cd.tar.xz initscripts-821dfcde7d027a566c5af861ee3f127070e933cd.zip |
ipcalc: parse prefix more safely
-rw-r--r-- | src/ipcalc.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/ipcalc.c b/src/ipcalc.c index bec14eb5..6a803f11 100644 --- a/src/ipcalc.c +++ b/src/ipcalc.c @@ -30,6 +30,7 @@ #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> +#include <errno.h> /*! \file ipcalc.c @@ -48,6 +49,24 @@ return host byte order, but there are some exceptions. */ +int safe_atoi(const char *s, int *ret_i) { + char *x = NULL; + long l; + + errno = 0; + l = strtol(s, &x, 0); + + if (!x || x == s || *x || errno) + return errno > 0 ? -errno : -EINVAL; + + if ((long) (int) l != l) + return -ERANGE; + + *ret_i = (int) l; + return 0; +} + + /*! \fn struct in_addr prefix2mask(int bits) \brief creates a netmask from a specified number of bits @@ -291,8 +310,9 @@ int main(int argc, const char **argv) { } if (prefixStr != NULL) { - prefix = atoi(prefixStr); - if (prefix < 0 || ((familyIPv6 && prefix > 128) || (!familyIPv6 && prefix > 32))) { + int r = 0; + r = safe_atoi(prefixStr, &prefix); + if (r != 0 || prefix < 0 || ((familyIPv6 && prefix > 128) || (!familyIPv6 && prefix > 32))) { if (!beSilent) fprintf(stderr, "ipcalc: bad prefix: %s\n", prefixStr); return 1; |