summaryrefslogtreecommitdiffstats
path: root/usr.sbin/tftpd
diff options
context:
space:
mode:
authordlg <dlg@openbsd.org>2014-11-25 23:52:09 +0000
committerdlg <dlg@openbsd.org>2014-11-25 23:52:09 +0000
commit4f801cb6e0cbe57bb95e67774a8a7c8ee5d55286 (patch)
tree3c45b2bacf21c20551a67e331621f80dc76fa39f /usr.sbin/tftpd
parentFix test. (diff)
downloadwireguard-openbsd-4f801cb6e0cbe57bb95e67774a8a7c8ee5d55286.tar.xz
wireguard-openbsd-4f801cb6e0cbe57bb95e67774a8a7c8ee5d55286.zip
evbuffer_read and evbuffer_write are wrappers around read and write,
so you have to check their return values in the same way and handle errors the same way. returning 0 from evbuffer_read means the other end of the socket has gone away. we should try again on both evbuffer_read and evbuffer_write if we get EAGAIN or EINTR. ok millert@ bluhm@
Diffstat (limited to 'usr.sbin/tftpd')
-rw-r--r--usr.sbin/tftpd/tftpd.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/usr.sbin/tftpd/tftpd.c b/usr.sbin/tftpd/tftpd.c
index 64282c0a6da..dd526f4c516 100644
--- a/usr.sbin/tftpd/tftpd.c
+++ b/usr.sbin/tftpd/tftpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tftpd.c,v 1.23 2014/11/19 11:48:39 dlg Exp $ */
+/* $OpenBSD: tftpd.c,v 1.24 2014/11/25 23:52:09 dlg Exp $ */
/*
* Copyright (c) 2012 David Gwynne <dlg@uq.edu.au>
@@ -453,8 +453,16 @@ rewrite_map(struct tftp_client *client, const char *filename)
void
rewrite_req(int fd, short events, void *arg)
{
- if (evbuffer_write(rwmap->wrbuf, fd) == -1)
- lerr(1, "rwmap read");
+ if (evbuffer_write(rwmap->wrbuf, fd) == -1) {
+ switch (errno) {
+ case EINTR:
+ case EAGAIN:
+ event_add(&rwmap->wrev, NULL);
+ return;
+ }
+
+ lerr(1, "rewrite socket write");
+ }
if (EVBUFFER_LENGTH(rwmap->wrbuf))
event_add(&rwmap->wrev, NULL);
@@ -467,8 +475,19 @@ rewrite_res(int fd, short events, void *arg)
char *filename;
size_t len;
- if (evbuffer_read(rwmap->rdbuf, fd, MAXPATHLEN) == -1)
- lerr(1, "rwmap read");
+ switch (evbuffer_read(rwmap->rdbuf, fd, MAXPATHLEN)) {
+ case -1:
+ switch (errno) {
+ case EINTR:
+ case EAGAIN:
+ return;
+ }
+ lerr(1, "rewrite socket read");
+ case 0:
+ lerrx(1, "rewrite socket closed");
+ default:
+ break;
+ }
while ((filename = evbuffer_readln(rwmap->rdbuf, &len,
EVBUFFER_EOL_LF)) != NULL) {