svn commit: r330710 - in head: libexec/tftpd libexec/tftpd/tests usr.bin/tftp
Alan Somers
asomers at FreeBSD.org
Fri Mar 9 23:25:19 UTC 2018
Author: asomers
Date: Fri Mar 9 23:25:18 2018
New Revision: 330710
URL: https://svnweb.freebsd.org/changeset/base/330710
Log:
tftpd: Flush files as soon as they are fully received
On an RRQ, tftpd doesn't exit as soon as it's finished receiving a file.
Instead, it waits five seconds just in case the client didn't receive the
server's last ACK and decides to resend the final DATA packet.
Unfortunately, this created a 5 second delay from when the client thinks
it's done sending the file, and when the file is available for other
processes.
Fix this bug by closing the file as soon as receipt is finished.
PR: 157700
Reported by: Barry Mishler <barry_mishler at yahoo.com>
MFC after: 3 weeks
Modified:
head/libexec/tftpd/tests/functional.c
head/libexec/tftpd/tftp-transfer.c
head/libexec/tftpd/tftpd.c
head/usr.bin/tftp/tftp.c
Modified: head/libexec/tftpd/tests/functional.c
==============================================================================
--- head/libexec/tftpd/tests/functional.c Fri Mar 9 23:17:29 2018 (r330709)
+++ head/libexec/tftpd/tests/functional.c Fri Mar 9 23:25:18 2018 (r330710)
@@ -694,7 +694,6 @@ TFTPD_TC_DEFINE(w_flag,, w_flag = 1;)
send_data(1, contents, contents_len);
recv_ack(1);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("small.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -731,7 +730,6 @@ TFTPD_TC_DEFINE(wrq_dropped_ack,)
send_data(2, (const char*)&contents[128], 256);
recv_ack(2);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("medium.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -764,7 +762,6 @@ TFTPD_TC_DEFINE(wrq_dropped_data,)
send_data(1, contents, contents_len);
recv_ack(1);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("small.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -798,7 +795,6 @@ TFTPD_TC_DEFINE(wrq_duped_data,)
send_data(2, (const char*)&contents[128], 256);
recv_ack(2);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("medium.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -865,7 +861,6 @@ TFTPD_TC_DEFINE(wrq_medium,)
send_data(2, (const char*)&contents[128], 256);
recv_ack(2);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("medium.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -891,14 +886,13 @@ TFTPD_TC_DEFINE(wrq_netascii,)
fd = open("unix.txt", O_RDWR | O_CREAT, 0666);
ATF_REQUIRE(fd >= 0);
close(fd);
- contents_len = strlen(contents) + 1;
+ contents_len = sizeof(contents);
SEND_WRQ("unix.txt", "netascii");
recv_ack(0);
send_data(1, contents, contents_len);
recv_ack(1);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("unix.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
@@ -938,7 +932,6 @@ TFTPD_TC_DEFINE(wrq_small,)
send_data(1, contents, contents_len);
recv_ack(1);
- atf_tc_expect_fail("PR 157700 tftpd expects more data after EOF");
fd = open("small.txt", O_RDONLY);
r = read(fd, buffer, sizeof(buffer));
close(fd);
Modified: head/libexec/tftpd/tftp-transfer.c
==============================================================================
--- head/libexec/tftpd/tftp-transfer.c Fri Mar 9 23:17:29 2018 (r330709)
+++ head/libexec/tftpd/tftp-transfer.c Fri Mar 9 23:25:18 2018 (r330710)
@@ -304,6 +304,8 @@ send_ack:
gettimeofday(&(ts->tstop), NULL);
} while (n_data == segsize);
+ write_close();
+
/* Don't do late packet management for the client implementation */
if (acting_as_client)
return;
Modified: head/libexec/tftpd/tftpd.c
==============================================================================
--- head/libexec/tftpd/tftpd.c Fri Mar 9 23:17:29 2018 (r330709)
+++ head/libexec/tftpd/tftpd.c Fri Mar 9 23:25:18 2018 (r330710)
@@ -823,7 +823,6 @@ tftp_recvfile(int peer, const char *mode)
block = 0;
tftp_receive(peer, &block, &ts, NULL, 0);
- write_close();
gettimeofday(&now2, NULL);
if (debug&DEBUG_SIMPLE) {
Modified: head/usr.bin/tftp/tftp.c
==============================================================================
--- head/usr.bin/tftp/tftp.c Fri Mar 9 23:17:29 2018 (r330709)
+++ head/usr.bin/tftp/tftp.c Fri Mar 9 23:25:18 2018 (r330710)
@@ -265,7 +265,6 @@ recvfile(int peer, char *port, int fd, char *name, cha
tftp_receive(peer, &block, &tftp_stats, rp, n);
}
- write_close();
if (tftp_stats.amount > 0)
printstats("Received", verbose, &tftp_stats);
return;
More information about the svn-src-all
mailing list