diff options
author | obrien <obrien@FreeBSD.org> | 2013-07-03 22:44:26 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2013-07-03 22:44:26 +0000 |
commit | d45f18e9d7e0dfff49a12196a8f4c325eefee716 (patch) | |
tree | a9e0769df784c3884354be7647dd2aba8046db12 | |
parent | 85ce2c58ff0686d38588441ec3e73ec11e901a71 (diff) | |
download | FreeBSD-src-d45f18e9d7e0dfff49a12196a8f4c325eefee716.zip FreeBSD-src-d45f18e9d7e0dfff49a12196a8f4c325eefee716.tar.gz |
Merge r252512 from src/gnu/usr.bin/patch into src/usr.bin/patch:
Make it so that 'patch < FUBAR' and 'patch -i FUBAR' operate the same.
The former makes a copy of stdin, but was not accurately putting the
content of stdin into a temp file. This lead to the undercounting
the number of lines in hunks containing NUL characters when reading
from stdin. Thus resulting in "unexpected end of file in patch" errors.
-rw-r--r-- | usr.bin/patch/pch.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/usr.bin/patch/pch.c b/usr.bin/patch/pch.c index 411dcac..c4792b2 100644 --- a/usr.bin/patch/pch.c +++ b/usr.bin/patch/pch.c @@ -101,13 +101,17 @@ void open_patch_file(const char *filename) { struct stat filestat; + int nr, nw; if (filename == NULL || *filename == '\0' || strEQ(filename, "-")) { pfp = fopen(TMPPATNAME, "w"); if (pfp == NULL) pfatal("can't create %s", TMPPATNAME); - while (fgets(buf, buf_size, stdin) != NULL) - fputs(buf, pfp); + while ((nr = fread(buf, 1, buf_size, stdin)) > 0) { + nw = fwrite(buf, 1, nr, pfp); + if (nr != nw) + pfatal("write error to %s", TMPPATNAME); + } if (ferror(pfp) || fclose(pfp)) pfatal("can't write %s", TMPPATNAME); filename = TMPPATNAME; |