summaryrefslogtreecommitdiffstats
path: root/usr.sbin/tftp-proxy/tftp-proxy.c
diff options
context:
space:
mode:
authorflorian <florian@openbsd.org>2013-12-23 13:08:25 +0000
committerflorian <florian@openbsd.org>2013-12-23 13:08:25 +0000
commitb27441fec95d048d2497365d824b77b74065055d (patch)
treec35773a3202a19773ee5f7d22554d0602241e35c /usr.sbin/tftp-proxy/tftp-proxy.c
parentMake it possible to give -a multiple times on the command line. (diff)
downloadwireguard-openbsd-b27441fec95d048d2497365d824b77b74065055d.tar.xz
wireguard-openbsd-b27441fec95d048d2497365d824b77b74065055d.zip
When no address for the current AF was specified with -a generate pass
rules instead of erroring out. ok dlg, benno, camield
Diffstat (limited to 'usr.sbin/tftp-proxy/tftp-proxy.c')
-rw-r--r--usr.sbin/tftp-proxy/tftp-proxy.c27
1 files changed, 13 insertions, 14 deletions
diff --git a/usr.sbin/tftp-proxy/tftp-proxy.c b/usr.sbin/tftp-proxy/tftp-proxy.c
index 4c6d36364cd..2d216be7370 100644
--- a/usr.sbin/tftp-proxy/tftp-proxy.c
+++ b/usr.sbin/tftp-proxy/tftp-proxy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tftp-proxy.c,v 1.9 2013/12/23 13:07:47 florian Exp $
+/* $OpenBSD: tftp-proxy.c,v 1.10 2013/12/23 13:08:25 florian Exp $
*
* Copyright (c) 2005 DLS Internet Services
* Copyright (c) 2004, 2005 Camiel Dobbelaar, <cd@sentia.nl>
@@ -454,22 +454,17 @@ privproc_pop(int fd, short events, void *arg)
&on, sizeof(on)) == -1)
lerr(1, "privproc setsockopt(REUSEPORT)");
- if (TAILQ_EMPTY(&src_addrs)) {
+ TAILQ_FOREACH(saddr, &src_addrs, entry)
+ if (saddr->addr.ss_family == req.src.ss_family)
+ break;
+ if (saddr == NULL) {
if (bind(rep->fd, (struct sockaddr *)&req.src,
req.src.ss_len) == -1)
lerr(1, "privproc bind");
} else {
- TAILQ_FOREACH(saddr, &src_addrs, entry)
- if (saddr->addr.ss_family ==
- req.src.ss_family) {
- if (bind(rep->fd, (struct sockaddr*)
- &saddr->addr, saddr->addrlen) == -1)
- lerr(1, "privproc bind");
- break;
- }
-
- if (saddr == NULL)
- lerr(1, "no source address found");
+ if (bind(rep->fd, (struct sockaddr*)&saddr->addr,
+ saddr->addrlen) == -1)
+ lerr(1, "privproc bind");
}
if (TAILQ_EMPTY(&p->replies))
@@ -793,6 +788,7 @@ unprivproc_pop(int fd, short events, void *arg)
} cmsgbuf;
struct cmsghdr *cmsg;
struct iovec iov;
+ struct src_addr *src_addr;
struct sockaddr_storage saddr;
socklen_t len;
int result;
@@ -857,7 +853,10 @@ unprivproc_pop(int fd, short events, void *arg)
if (prepare_commit(r->id) == -1)
lerr(1, "%s: prepare_commit", __func__);
- if (TAILQ_EMPTY(&src_addrs)) {
+ TAILQ_FOREACH(src_addr, &src_addrs, entry)
+ if (src_addr->addr.ss_family == r->addrs.dst.ss_family)
+ break;
+ if (src_addr == NULL) {
if (add_filter(r->id, PF_IN, (struct sockaddr *)
&r->addrs.dst, (struct sockaddr *)&r->addrs.src,
ntohs(((struct sockaddr_in *)&r->addrs.src)