]> err.no Git - moreutils/commitdiff
sponge: Correct bad use of fread that caused a trailing quantity of soaked data to...
authorJoey Hess <joey@kitenet.net>
Thu, 2 Sep 2010 20:39:51 +0000 (16:39 -0400)
committerJoey Hess <joey@kitenet.net>
Thu, 2 Sep 2010 20:39:51 +0000 (16:39 -0400)
This bug was sorta introduced by 6f31909ff74c064ea0b5126219b3e8f7b8826bee.

Actually, the buggy fread was there before also, and would have happened
on quantities of data not evenly divisible by 8.

debian/changelog
sponge.c

index f298d9153ca332771bee37a6558d71bf866ede7e..349a21e5aea6345fa1cec25bb3823af78fc1383d 100644 (file)
@@ -2,6 +2,9 @@ moreutils (0.41) UNRELEASED; urgency=low
 
   * ifdata.docbook: Mark interface as required in synopsis. Closes: #588397
   * Add missing AUTHOR section to docbook man pages.
+  * sponge: Correct bad use of fread that caused a trailing quantity of
+    soaked data to be silently discarded when a temp file was used
+    and sponge output to stdout. Closes: #595220
 
  -- Joey Hess <joeyh@debian.org>  Thu, 08 Jul 2010 14:40:07 -0400
 
index 80733a22387f8290b77434f04a6a5dae099cc6b9..242298deb641650bd25e8b68b52ca72f82becfa4 100644 (file)
--- a/sponge.c
+++ b/sponge.c
@@ -199,15 +199,16 @@ static void write_buff_out(char* buff, size_t length, FILE *fd) {
 }
 
 static void copy_tmpfile(FILE *tmpfile, FILE *outfile, char *buf, size_t size) {
-       if (fseek(tmpfile, 0, SEEK_SET)) {
+       ssize_t i;
+       if (lseek(fileno(tmpfile), 0, SEEK_SET)) {
                perror("could to seek to start of temporary file");
                fclose(tmpfile);
                exit(1);
        }
-       while (fread(buf, size, 1, tmpfile) > 0) {
-               write_buff_out(buf, size, outfile);
+       while ((i = read(fileno(tmpfile), buf, size)) > 0) {
+               write_buff_out(buf, i, outfile);
        }
-       if (ferror(tmpfile)) {
+       if (i == -1) {
                perror("read temporary file");
                fclose(tmpfile);
                exit(1);