Robin Farine writes:
authorEric Andersen <andersen@codepoet.org>
Tue, 22 Jun 2004 10:18:30 +0000 (10:18 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 22 Jun 2004 10:18:30 +0000 (10:18 -0000)
Hi,

Package: BusyBox
Version: 1.0.0-pre10

When an incomplete read or write from/to a local file occurs (i.e.
not an EOF condition), the tftp client prematurely exits. This
problem can be reproduced by slowly piping data to the tftp client
like this:

  (for v in 1 2 3; do echo $v; sleep 1; done) | \
  tftp -p -l - -r output.txt <host>

The output file on the TFTP server will contain "1".

The attached patch provides a possible solution to this problem.

I can reproduce this on ARM sa1110 and ARM xscale boards, both
running Linux-2.6.4 & glibc-2.3.2. Thanks for the wonderful
program!

Robin

networking/tftp.c

index bfa9897..02ddb4d 100644 (file)
@@ -267,7 +267,7 @@ static inline int tftp(const int cmd, const struct hostent *host,
                        block_nr++;
 
                        if (cmd_put && (opcode == TFTP_DATA)) {
-                               len = read(localfd, cp, tftp_bufsize - 4);
+                               len = bb_full_read(localfd, cp, tftp_bufsize - 4);
 
                                if (len < 0) {
                                        bb_perror_msg("read");
@@ -444,7 +444,7 @@ static inline int tftp(const int cmd, const struct hostent *host,
 
                        if (tmp == block_nr) {
                        
-                               len = write(localfd, &buf[4], len - 4);
+                               len = bb_full_write(localfd, &buf[4], len - 4);
 
                                if (len < 0) {
                                        bb_perror_msg("write");