From 52e120f5533c93b0874cefd52b60bf65d6a640b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Courr=C3=A8ges-Anglas?= Date: Mon, 3 Mar 2014 21:25:09 +0100 Subject: Make read_number more strict, returning errors. * use strtol, and warn about overflow or invalid input. --- src/actions.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/actions.c b/src/actions.c index 5ac17a2..a19146a 100644 --- a/src/actions.c +++ b/src/actions.c @@ -2185,9 +2185,19 @@ read_number (struct argspec *spec, struct sbuf *s, struct cmdarg **arg) if (input) { + char *ep; + long lval; + + errno = 0; + lval = strtol (input, &ep, 10); + if (input[0] == '\0' || *ep != '\0') + return cmdret_new (RET_FAILURE, "malformed number `%s'", input); + if ((errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) || + (lval > INT_MAX || lval < INT_MIN)) + return cmdret_new (RET_FAILURE, "out of range number `%s'", input); *arg = xmalloc (sizeof(struct cmdarg)); (*arg)->type = arg_NUMBER; - (*arg)->arg.number = strtol (input, NULL, 10); + (*arg)->arg.number = lval; (*arg)->string = input; return NULL; } -- cgit v1.2.3