Last update, with Tobias's help. The following diff - changes MAXPATHLEN from sys/param.h to PATH_MAX from limits.h - adds a missing prototype for sane_count - locate.bigram and locate.code now abort when reading a pathname exceeding PATH_MAX bytes on stdin
Index: src/usr.bin/locate//bigram/locate.bigram.c =================================================================== RCS file: /cvs/src/usr.bin/locate/bigram/locate.bigram.c,v retrieving revision 1.12 diff -u -p -u -r1.12 locate.bigram.c --- src/usr.bin/locate//bigram/locate.bigram.c 27 Oct 2009 23:59:39 -0000 1.12 +++ src/usr.bin/locate//bigram/locate.bigram.c 26 Nov 2014 18:15:13 -0000 @@ -43,30 +43,41 @@ * Use 'code' to encode a file using this output. */ +#include <err.h> +#include <limits.h> /* for PATH_MAX */ #include <stdio.h> #include <stdlib.h> -#include <sys/param.h> /* for MAXPATHLEN */ +#include <string.h> #include "locate.h" -u_char buf1[MAXPATHLEN] = " "; -u_char buf2[MAXPATHLEN]; +u_char buf[PATH_MAX] = " "; u_int bigram[UCHAR_MAX + 1][UCHAR_MAX + 1]; int main(void) { u_char *cp; - u_char *oldpath = buf1, *path = buf2; + u_char *oldpath = buf, *path, *mbuf; u_int i, j; + size_t len; - while (fgets(path, sizeof(buf2), stdin) != NULL) { + mbuf = NULL; - /* - * We don't need remove newline character '\n'. - * '\n' is less than ASCII_MIN and will be later - * ignored at output. - */ + while ((path=(u_char *)fgetln(stdin, &len)) != NULL) { + if (path[len-1] == '\n') + path[len-1] = '\0'; + else { + if ((mbuf=malloc(len+1)) == NULL) + err(1, "malloc"); + memcpy(mbuf, path, len); + mbuf[len] = '\0'; + len++; + path = mbuf; + } + if (len > sizeof(buf)) + errx(1, "pathname exceeding %zu byte limit: %s", + sizeof(buf), path); /* skip longest common prefix */ for (cp = path; *cp == *oldpath; cp++, oldpath++) @@ -78,14 +89,7 @@ main(void) cp += 2; } - /* swap pointers */ - if (path == buf1) { - path = buf2; - oldpath = buf1; - } else { - path = buf1; - oldpath = buf2; - } + memcpy(buf, path, len); } /* output, boundary check */ Index: src/usr.bin/locate//code/locate.code.c =================================================================== RCS file: /cvs/src/usr.bin/locate/code/locate.code.c,v retrieving revision 1.17 diff -u -p -u -r1.17 locate.code.c --- src/usr.bin/locate//code/locate.code.c 17 Nov 2013 20:19:36 -0000 1.17 +++ src/usr.bin/locate//code/locate.code.c 26 Nov 2014 18:15:13 -0000 @@ -78,10 +78,10 @@ * Wolfram Schneider, Berlin September 1996 */ -#include <sys/param.h> #include <err.h> #include <errno.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -91,8 +91,7 @@ #define BGBUFSIZE (NBG * 2) /* size of bigram buffer */ -u_char buf1[MAXPATHLEN] = " "; -u_char buf2[MAXPATHLEN]; +u_char buf[PATH_MAX] = " "; u_char bigrams[BGBUFSIZE + 1] = { 0 }; #define LOOKUP 1 /* use a lookup array instead a function, 3x faster */ @@ -115,7 +114,8 @@ extern int optopt; int main(int argc, char *argv[]) { - u_char *cp, *oldpath, *path; + u_char *cp, *oldpath, *path, *mbuf; + size_t len; int ch, code, count, diffcount, oldcount; FILE *fp; int i, j; @@ -156,23 +156,31 @@ main(int argc, char *argv[]) #endif /* LOOKUP */ - oldpath = buf1; - path = buf2; + oldpath = buf; oldcount = 0; + mbuf = NULL; - while (fgets(path, sizeof(buf2), stdin) != NULL) { - + while ((path=(u_char *)fgetln(stdin, &len)) != NULL) { /* skip empty lines */ if (*path == '\n') continue; - /* remove newline */ - for (cp = path; *cp != '\0'; cp++) { - /* chop newline */ - if (*cp == '\n') - *cp = '\0'; + if (path[len-1] == '\n') { + /* remove newline */ + path[len-1] = '\0'; + } else { + if ((mbuf = malloc(len+1)) == NULL) + err(1, "malloc"); + memcpy(mbuf, path, len); + mbuf[len] = '\0'; + len++; + path = mbuf; } + if (len > sizeof(buf)) + errx(1, "pathname exceeding %zu byte limit: %s", + sizeof(buf), path); + /* Skip longest common prefix. */ for (cp = path; *cp == *oldpath; cp++, oldpath++) if (*cp == '\0') @@ -222,14 +230,11 @@ main(int argc, char *argv[]) } } - if (path == buf1) { /* swap pointers */ - path = buf2; - oldpath = buf1; - } else { - path = buf1; - oldpath = buf2; - } + memcpy(buf, path, len); } + + free(mbuf); + /* Non-zero status if there were errors */ if (fflush(stdout) != 0 || ferror(stdout)) exit(1); Index: src/usr.bin/locate//locate/fastfind.c =================================================================== RCS file: /cvs/src/usr.bin/locate/locate/fastfind.c,v retrieving revision 1.11 diff -u -p -u -r1.11 fastfind.c --- src/usr.bin/locate//locate/fastfind.c 25 Oct 2010 19:16:45 -0000 1.11 +++ src/usr.bin/locate//locate/fastfind.c 26 Nov 2014 18:15:13 -0000 @@ -47,7 +47,7 @@ statistic (fp, path_fcodes) u_char *p, *s; int c; int count, umlaut; - u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN]; + u_char bigram1[NBG], bigram2[NBG], path[PATH_MAX]; for (c = 0, p = bigram1, s = bigram2; c < NBG; c++) { p[c] = check_bigram_char(getc(fp)); @@ -140,7 +140,7 @@ fastfind int c, cc; int count, found, globflag; u_char *cutoff; - u_char bigram1[NBG], bigram2[NBG], path[MAXPATHLEN]; + u_char bigram1[NBG], bigram2[NBG], path[PATH_MAX]; #ifdef FF_ICASE /* use a lookup table for case insensitive search */ Index: src/usr.bin/locate//locate/locate.c =================================================================== RCS file: /cvs/src/usr.bin/locate/locate/locate.c,v retrieving revision 1.25 diff -u -p -u -r1.25 locate.c --- src/usr.bin/locate//locate/locate.c 13 Apr 2012 15:13:07 -0000 1.25 +++ src/usr.bin/locate//locate/locate.c 26 Nov 2014 18:15:13 -0000 @@ -63,11 +63,11 @@ * in the standard 'find'. */ -#include <sys/param.h> #include <ctype.h> #include <err.h> #include <fnmatch.h> #include <libgen.h> +#include <limits.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> @@ -112,6 +112,7 @@ void fastfind(FILE *, char *, char *) void fastfind_icase(FILE *, char *, char *); void fastfind_mmap(char *, caddr_t, int, char *); void fastfind_mmap_icase(char *, caddr_t, int, char *); +void sane_count(int); void search_mmap(char *, char **); void search_fopen(char *, char **); unsigned long cputime(void); @@ -334,7 +335,7 @@ usage(void) void sane_count(int count) { - if (count < 0 || count >= MAXPATHLEN) { + if (count < 0 || count >= PATH_MAX) { fprintf(stderr, "locate: corrupted database\n"); exit(1); } Index: src/usr.bin/locate//locate/util.c =================================================================== RCS file: /cvs/src/usr.bin/locate/locate/util.c,v retrieving revision 1.12 diff -u -p -u -r1.12 util.c --- src/usr.bin/locate//locate/util.c 16 Nov 2014 00:04:53 -0000 1.12 +++ src/usr.bin/locate//locate/util.c 26 Nov 2014 18:15:13 -0000 @@ -35,11 +35,11 @@ */ -#include <stdlib.h> -#include <string.h> #include <err.h> -#include <sys/param.h> +#include <limits.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include "locate.h" @@ -242,12 +242,12 @@ getwm(p) i = u.i; - if (i > MAXPATHLEN || i < -(MAXPATHLEN)) { + if (i > PATH_MAX || i < -(PATH_MAX)) { i = ntohl(i); - if (i > MAXPATHLEN || i < -(MAXPATHLEN)) { + if (i > PATH_MAX || i < -(PATH_MAX)) { (void)fprintf(stderr, - "integer out of +-MAXPATHLEN (%d): %d\n", - MAXPATHLEN, i); + "integer out of +-PATH_MAX (%d): %d\n", + PATH_MAX, i); exit(1); } } @@ -270,12 +270,12 @@ getwf(fp) word = getw(fp); - if (word > MAXPATHLEN || word < -(MAXPATHLEN)) { + if (word > PATH_MAX || word < -(PATH_MAX)) { word = ntohl(word); - if (word > MAXPATHLEN || word < -(MAXPATHLEN)) { + if (word > PATH_MAX || word < -(PATH_MAX)) { (void)fprintf(stderr, - "integer out of +-MAXPATHLEN (%d): %d\n", - MAXPATHLEN, word); + "integer out of +-PATH_MAX (%d): %d\n", + PATH_MAX, word); exit(1); } }