On Wed, 2011-03-30 at 14:20 +0200, Denys Vlasenko wrote:
On Wed, 2011-03-30 at 14:02 +0200, Nikola Pajkovsky wrote:
Signed-off-by: Nikola Pajkovsky npajkovs@redhat.com
src/lib/event_config.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/lib/event_config.c b/src/lib/event_config.c index 7a8b5e3..b855394 100644 --- a/src/lib/event_config.c +++ b/src/lib/event_config.c @@ -304,10 +304,22 @@ static char *validate_event_option(event_option_t *opt) break; case OPTION_TYPE_NUMBER: {
long r = strtol(opt->value, (char **)&s, 10);
(void) r;
if (*s || errno)
char *endptr;
errno = 0;
long r = strtol(opt->value, &endptr, 10);
if ((errno == ERANGE && (r == LONG_MAX || r == LONG_MIN))
|| (errno != 0 && r == 0))
{
perror_msg("strtol");
return xasprintf(_("Invalid number '%s'"), opt->value);
}
if (endptr == str)
return xasprintf(_("No digits were found '%s'"), opt->value);
if (*endptr) return xasprintf(_("Invalid number '%s'"), opt->value);
Wow. Now it does too much IMO... I propose something like this:
char *endptr; errno = 0; long r = strtol(opt->value, &endptr, 10); (void) r; if (errno != 0 || endptr == str || *endptr != '\0')
s/str/opt->value in the line above:
if (errno != 0 || endptr == opt->value || *endptr != '\0')
{ return xasprintf(_("Invalid number '%s'"), opt->value); }
Rationale: any errno != 0 indicates error, need just check that, no need to check for ERANGE. endptr == str checks for "" case. *endptr != '\0' checks for "123garbage" case.