Hi, change atoi(3) -> strtonum(3) in lpr(1) and lprm(1). lprm(1) avoids negative numbers to be the first argument by using getopt(3), but supported values like 2.2.
--F. Index: lpr/lpr.c =================================================================== RCS file: /cvs/src/usr.sbin/lpr/lpr/lpr.c,v retrieving revision 1.48 diff -u -p -r1.48 lpr.c --- lpr/lpr.c 9 Feb 2015 23:00:14 -0000 1.48 +++ lpr/lpr.c 25 Sep 2015 12:08:57 -0000 @@ -112,6 +112,7 @@ main(int argc, char **argv) char buf[PATH_MAX]; int i, f, ch; struct stat stb; + const char *errstr; /* * Simulate setuid daemon w/ PRIV_END called. @@ -145,11 +146,11 @@ main(int argc, char **argv) switch (ch) { case '#': /* n copies */ - if (isdigit((unsigned char)*optarg)) { - i = atoi(optarg); - if (i > 0) - ncopies = i; - } + i = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + errx(1, "invalid quantity number"); + if (i > 0) + ncopies = i; break; case '4': /* troff fonts */ @@ -203,7 +204,9 @@ main(int argc, char **argv) case 'i': /* indent output */ iflag++; - indent = atoi(optarg); + indent = strtonum(optarg, 0, INT_MAX, &errstr); + if (errstr) + errx(1, "invalid number"); if (indent < 0) indent = 8; break; Index: lprm/lprm.c =================================================================== RCS file: /cvs/src/usr.sbin/lpr/lprm/lprm.c,v retrieving revision 1.21 diff -u -p -r1.21 lprm.c --- lprm/lprm.c 16 Jan 2015 06:40:18 -0000 1.21 +++ lprm/lprm.c 25 Sep 2015 12:08:57 -0000 @@ -77,8 +77,9 @@ main(int argc, char **argv) { struct passwd *pw; char *cp; + const char *errstr; long l; - int ch; + int ch, i; /* * Simulate setuid daemon w/ PRIV_END called. @@ -135,7 +136,10 @@ main(int argc, char **argv) if (isdigit((unsigned char)*argv[0])) { if (requests >= MAXREQUESTS) fatal("Too many requests"); - requ[requests++] = atoi(argv[0]); + i = strtonum(argv[0], 0, INT_MAX, &errstr); + if (errstr) + fatal("invalid job number"); + requ[requests++] = i; } else { if (users >= MAXUSERS) fatal("Too many users");