summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2013-08-13 12:39:03 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2013-08-13 12:39:03 +0000
commitc121604a5734ac41552ab46a8ab75345be99036e (patch)
treed5d2aa78e5fb0952a86ac62767a667a13fb7febf
parentd76fb2ab61697e87cf28b0c807b8b8aa8a7f6875 (diff)
when handling puts from a client (ie, tftpd is writing a file to
disk), we maintain the client state after we've finished writing the file in case the client loses our ack of the last write. unfortunately we didnt close the file we'd just written when we knew it was finished, but only after we clean up the client state after that wait. because we use FILE stuff to write the file out, its likely some io flushed to disk until we finish that wait and close the file as part of cleaning up the client state. if something is coordinating a bunch of uploads and expects the file to be there after the client is happy its there, this can be "not good". this closes the file after we know its finished before proceeding to hang to handle lost acks to the client. found by and ok henning@
-rw-r--r--usr.sbin/tftpd/tftpd.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/usr.sbin/tftpd/tftpd.c b/usr.sbin/tftpd/tftpd.c
index 9e41d81cd75..e210be15030 100644
--- a/usr.sbin/tftpd/tftpd.c
+++ b/usr.sbin/tftpd/tftpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tftpd.c,v 1.15 2013/06/01 21:06:39 deraadt Exp $ */
+/* $OpenBSD: tftpd.c,v 1.16 2013/08/13 12:39:02 dlg Exp $ */
/*
* Copyright (c) 2012 David Gwynne <dlg@uq.edu.au>
@@ -1274,6 +1274,8 @@ tftp_wrq(int fd, short events, void *arg)
if (n < client->packet_size) {
tftp_wrq_ack_packet(client);
+ fclose(client->file);
+ client->file = NULL;
event_set(&client->sev, client->sock, EV_READ,
tftp_wrq_end, client);
event_add(&client->sev, &client->tv);