On Thu, Mar 01, 2018 at 09:27:49PM -0600, Scott Cheloha wrote:
> Hey,
> 
> This adds the more typical strtoll(3) checks we have elsewhere
> in the tree to cmp(1).  Make sure we (a) got a number at all,
> (b) that it doesn't have any dangling non-digits, (c) that it's
> non-negative, and (d) that it didn't overflow.

> Index: usr.bin/cmp/cmp.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/cmp/cmp.c,v
> retrieving revision 1.16
> diff -u -p -r1.16 cmp.c
> --- usr.bin/cmp/cmp.c 28 Oct 2016 07:22:59 -0000      1.16
> +++ usr.bin/cmp/cmp.c 2 Mar 2018 03:24:02 -0000

> @@ -141,6 +123,23 @@ main(int argc, char *argv[])
>               c_regular(fd1, file1, skip1, sb1.st_size,
>                   fd2, file2, skip2, sb2.st_size);
>       return 0;
> +}
> +
> +static off_t
> +get_skip(const char *arg, const char *name)
> +{
> +        off_t skip;
> +        char *ep;   
> + 
> +        errno = 0;
> +        skip = strtoll(arg, &ep, 0);
> +        if (ep == arg || *ep != '\0')
> +                fatalx("%s is invalid: %s", name, arg);
> +        if (skip < 0)
> +                fatalx("%s is too small: %s", name, arg);
> +        if (skip == LLONG_MAX && errno == ERANGE)
> +                fatalx("%s is too large: %s", name, arg);
> +        return skip;
That's what strtonum(3) is for, why not using it?

Reply via email to