summaryrefslogtreecommitdiffstats
path: root/usr.bin/comm
diff options
context:
space:
mode:
authorjh <jh@FreeBSD.org>2009-12-12 18:18:46 +0000
committerjh <jh@FreeBSD.org>2009-12-12 18:18:46 +0000
commit6f2f9130ae5714e33ad56898dfeb3e346eabe1ac (patch)
treebaf10a3cfd8781a67dfd541bad7dcfd9be5bec94 /usr.bin/comm
parent1cb0051d8fdfdee7a6f9572c91c5c1f89d419c53 (diff)
downloadFreeBSD-src-6f2f9130ae5714e33ad56898dfeb3e346eabe1ac.zip
FreeBSD-src-6f2f9130ae5714e33ad56898dfeb3e346eabe1ac.tar.gz
Don't read the newline character to line buffer because lines are passed
to wcscoll(3). Newline characters could cause incorrect results when comparing lines. Also, if an input line didn't contain a newline character, it was omitted from the output. According to my interpretation, SUSv3 requires that the newline is always printed. Add regression tests for the cases. [1] PR: bin/140976 Submitted by: D'Arcy Cain (original version) [1] Approved by: trasz (mentor)
Diffstat (limited to 'usr.bin/comm')
-rw-r--r--usr.bin/comm/comm.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/usr.bin/comm/comm.c b/usr.bin/comm/comm.c
index ea92673..5e1ab54 100644
--- a/usr.bin/comm/comm.c
+++ b/usr.bin/comm/comm.c
@@ -163,7 +163,7 @@ main(int argc, char *argv[])
if (!comp) {
read1 = read2 = 1;
if (col3 != NULL)
- (void)printf("%ls%ls", col3, line1);
+ (void)printf("%ls%ls\n", col3, line1);
continue;
}
@@ -172,12 +172,12 @@ main(int argc, char *argv[])
read1 = 1;
read2 = 0;
if (col1 != NULL)
- (void)printf("%ls%ls", col1, line1);
+ (void)printf("%ls%ls\n", col1, line1);
} else {
read1 = 0;
read2 = 1;
if (col2 != NULL)
- (void)printf("%ls%ls", col2, line2);
+ (void)printf("%ls%ls\n", col2, line2);
}
}
exit(0);
@@ -190,19 +190,16 @@ getline(wchar_t *buf, size_t *buflen, FILE *fp)
wint_t ch;
bufpos = 0;
- do {
- if ((ch = getwc(fp)) != WEOF) {
- if (bufpos + 2 >= *buflen) {
- *buflen = *buflen * 2;
- buf = reallocf(buf, *buflen * sizeof(*buf));
- if (buf == NULL)
- return (NULL);
- }
- buf[bufpos++] = ch;
+ while ((ch = getwc(fp)) != WEOF && ch != '\n') {
+ if (bufpos + 1 >= *buflen) {
+ *buflen = *buflen * 2;
+ buf = reallocf(buf, *buflen * sizeof(*buf));
+ if (buf == NULL)
+ return (NULL);
}
- } while (ch != WEOF && ch != '\n');
- if (bufpos + 1 != *buflen)
- buf[bufpos] = '\0';
+ buf[bufpos++] = ch;
+ }
+ buf[bufpos] = '\0';
return (bufpos != 0 || ch == '\n' ? buf : NULL);
}
@@ -212,7 +209,7 @@ show(FILE *fp, const char *fn, const wchar_t *offset, wchar_t *buf, size_t *bufl
{
do {
- (void)printf("%ls%ls", offset, buf);
+ (void)printf("%ls%ls\n", offset, buf);
} while ((buf = getline(buf, buflen, fp)) != NULL);
if (ferror(fp))
err(1, "%s", fn);
OpenPOWER on IntegriCloud