- Use LINE_MAX from limits.h as the maximum line length instead of
BUFSIZ. Use LINE_MAX * 2 as the buffer size (BSIZE). - Error out if we encounter a line longer than LINE_MAX. The previous behavior was to silently split long lines and produce corrupted output. PR: bin/151384
This commit is contained in:
parent
c19aa41514
commit
d8708af484
@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <err.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -328,8 +329,8 @@ prepfile(void)
|
||||
warnx("%d is colwidths, nelem %d", colwidths[i], nelem);*/
|
||||
}
|
||||
|
||||
#define BSIZE 2048
|
||||
char ibuf[BSIZE]; /* two screenfuls should do */
|
||||
#define BSIZE (LINE_MAX * 2)
|
||||
char ibuf[BSIZE];
|
||||
|
||||
int
|
||||
getline(void) /* get line; maintain curline, curlen; manage storage */
|
||||
@ -350,7 +351,7 @@ getline(void) /* get line; maintain curline, curlen; manage storage */
|
||||
curline = ibuf;
|
||||
}
|
||||
}
|
||||
if (!putlength && endblock - curline < BUFSIZ) { /* need storage */
|
||||
if (!putlength && endblock - curline < LINE_MAX + 1) { /* need storage */
|
||||
/*ww = endblock-curline; tt += ww;*/
|
||||
/*printf("#wasted %d total %d\n",ww,tt);*/
|
||||
if (!(curline = (char *) malloc(BSIZE)))
|
||||
@ -358,11 +359,16 @@ getline(void) /* get line; maintain curline, curlen; manage storage */
|
||||
endblock = curline + BSIZE;
|
||||
/*printf("#endb %d curline %d\n",endblock,curline);*/
|
||||
}
|
||||
for (p = curline, i = 1; i < BUFSIZ; *p++ = c, i++)
|
||||
if ((c = getchar()) == EOF || c == '\n')
|
||||
for (p = curline, i = 0;; *p++ = c, i++) {
|
||||
if ((c = getchar()) == EOF)
|
||||
break;
|
||||
if (i >= LINE_MAX)
|
||||
errx(1, "maximum line length (%d) exceeded", LINE_MAX);
|
||||
if (c == '\n')
|
||||
break;
|
||||
}
|
||||
*p = '\0';
|
||||
curlen = i - 1;
|
||||
curlen = i;
|
||||
return(c);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user