=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cut/cut.c,v retrieving revision 1.23 retrieving revision 1.24 diff -c -r1.23 -r1.24 *** src/usr.bin/cut/cut.c 2015/12/02 00:56:46 1.23 --- src/usr.bin/cut/cut.c 2018/03/30 09:25:06 1.24 *************** *** 1,4 **** ! /* $OpenBSD: cut.c,v 1.23 2015/12/02 00:56:46 schwarze Exp $ */ /* $NetBSD: cut.c,v 1.9 1995/09/02 05:59:23 jtc Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: cut.c,v 1.24 2018/03/30 09:25:06 tobias Exp $ */ /* $NetBSD: cut.c,v 1.9 1995/09/02 05:59:23 jtc Exp $ */ /* *************** *** 154,164 **** char positions[_POSIX2_LINE_MAX + 1]; void get_list(char *list) { int setautostart, start, stop; - char *pos; char *p; /* --- 154,185 ---- char positions[_POSIX2_LINE_MAX + 1]; + int + read_number(char **p) + { + size_t pos; + int dash, n; + const char *errstr; + char *q; + + q = *p + strcspn(*p, "-"); + dash = *q == '-'; + *q = '\0'; + n = strtonum(*p, 1, _POSIX2_LINE_MAX, &errstr); + if (errstr != NULL) + errx(1, "[-bcf] list: %s %s (allowed 1-%d)", *p, errstr, + _POSIX2_LINE_MAX); + if (dash) + *q = '-'; + *p = q; + + return n; + } + void get_list(char *list) { int setautostart, start, stop; char *p; /* *************** *** 176,205 **** setautostart = 1; } if (isdigit((unsigned char)*p)) { ! start = stop = strtol(p, &p, 10); if (setautostart && start > autostart) autostart = start; } if (*p == '-') { ! if (isdigit((unsigned char)p[1])) ! stop = strtol(p + 1, &p, 10); if (*p == '-') { ++p; if (!autostop || autostop > stop) autostop = stop; } } ! if (*p) errx(1, "[-bcf] list: illegal list value"); - if (!stop || !start) - errx(1, "[-bcf] list: values may not include zero"); - if (stop > _POSIX2_LINE_MAX) - errx(1, "[-bcf] list: %d too large (max %d)", - stop, _POSIX2_LINE_MAX); if (maxval < stop) maxval = stop; ! for (pos = positions + start; start++ <= stop; *pos++ = 1) ! ; } /* overlapping ranges */ --- 197,223 ---- setautostart = 1; } if (isdigit((unsigned char)*p)) { ! start = stop = read_number(&p); if (setautostart && start > autostart) autostart = start; } if (*p == '-') { ! if (isdigit((unsigned char)p[1])) { ! ++p; ! stop = read_number(&p); ! } if (*p == '-') { ++p; if (!autostop || autostop > stop) autostop = stop; } } ! if (*p != '\0' || !stop || !start) errx(1, "[-bcf] list: illegal list value"); if (maxval < stop) maxval = stop; ! if (start <= stop) ! memset(positions + start, 1, stop - start + 1); } /* overlapping ranges */