diff options
author | dlg <dlg@openbsd.org> | 2014-11-25 23:52:09 +0000 |
---|---|---|
committer | dlg <dlg@openbsd.org> | 2014-11-25 23:52:09 +0000 |
commit | 4f801cb6e0cbe57bb95e67774a8a7c8ee5d55286 (patch) | |
tree | 3c45b2bacf21c20551a67e331621f80dc76fa39f /usr.sbin/tftpd | |
parent | Fix test. (diff) | |
download | wireguard-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.c | 29 |
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) { |