diff --git a/ping_common.c b/ping_common.c index 0342e1a..1ab380c 100644 --- a/ping_common.c +++ b/ping_common.c @@ -271,6 +271,21 @@ void common_options(int ch) errno = 0; dbl = strtod(optarg, &ep); + if (errno || *ep != '\0') { + char *saved_locale; + int saved_errno; + saved_locale = strdup(setlocale(LC_NUMERIC, NULL)); + setlocale(LC_NUMERIC, "C"); + + errno = 0; + dbl = strtod(optarg, &ep); + saved_errno = errno; + + setlocale(LC_NUMERIC, saved_locale); + free(saved_locale); + errno = saved_errno; + } + if (errno || *ep != '\0' || !finite(dbl) || dbl < 0.0 || dbl >= (double)INT_MAX / 1000 - 1.0) { fprintf(stderr, "ping: bad timing interval\n");