diff options
author | Lukas Nykryn <lnykryn@redhat.com> | 2014-06-06 10:56:21 +0200 |
---|---|---|
committer | Lukas Nykryn <lnykryn@redhat.com> | 2014-06-06 14:38:16 +0200 |
commit | 54aa7d8e28b55a65038164b27a141bc13e813458 (patch) | |
tree | 762c0e56acf2c22294cc2be8c0db0b32cf3667e0 | |
parent | 37313ccb51ff6f24ad85294bbf76434ef7b229eb (diff) | |
download | initscripts-54aa7d8e28b55a65038164b27a141bc13e813458.tar initscripts-54aa7d8e28b55a65038164b27a141bc13e813458.tar.gz initscripts-54aa7d8e28b55a65038164b27a141bc13e813458.tar.bz2 initscripts-54aa7d8e28b55a65038164b27a141bc13e813458.tar.xz initscripts-54aa7d8e28b55a65038164b27a141bc13e813458.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 8decccad..ccb3f6db 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 @@ -286,8 +305,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; |