Hi,
a thing I spotted some weeks ago

- - - usr.bin/ftp/ftp.c l.1090 - - -

        d = 0;
        do {
                wr = write(fileno(fout), buf + d, rd);
                if (wr == -1 && errno == EPIPE)
                        break;
                d += wr;
                rd -= wr;
        } while (d < c);

If write() fails without EPIPE, d is decremented, and the function
keeps looping. If write() succeeds after several loops, d will be
negative, and the function will write from buf-XX.

Since d is later used to display a proper error message, I'd suggest
this patch:


Index: ftp.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/ftp.c,v
retrieving revision 1.83
diff -u -r1.83 ftp.c
--- ftp.c       13 Nov 2013 20:41:14 -0000      1.83
+++ ftp.c       22 Nov 2013 06:23:32 -0000
@@ -1094,7 +1094,7 @@
                                        break;
                                d += wr;
                                rd -= wr;
-                       } while (d < c);
+                       } while (d < c && d > 0);
                        if (rd != 0)
                                break;
                        bytes += c;


Any opinion?

Reply via email to