summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2017-09-19 13:09:15 +0000
committerkrw <krw@openbsd.org>2017-09-19 13:09:15 +0000
commit6c5bfcb118631db94624e9e21d29b9261638e2e1 (patch)
tree5a86b5295ea8d6ae6a11e02c45881b9cc61a56eb
parentflush_unpriv_ibuf() is now used only once so no (diff)
downloadwireguard-openbsd-6c5bfcb118631db94624e9e21d29b9261638e2e1.tar.xz
wireguard-openbsd-6c5bfcb118631db94624e9e21d29b9261638e2e1.zip
Make send_packet() usage consistent. i.e. don't exit
if send_packet(DISCOVER) fails. Distinguish between writev() and sendmsg() errors in send_packet() log messages. Check for short writes no matter how the packet is output. Return failure in this occurs. Check results of all send_packet() calls. If send_packet() fails, don't log that the DHCP message was sent.
-rw-r--r--sbin/dhclient/bpf.c25
-rw-r--r--sbin/dhclient/dhclient.c28
2 files changed, 36 insertions, 17 deletions
diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c
index e1d7ce12ebc..6d57aa868ab 100644
--- a/sbin/dhclient/bpf.c
+++ b/sbin/dhclient/bpf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bpf.c,v 1.65 2017/09/17 21:20:23 krw Exp $ */
+/* $OpenBSD: bpf.c,v 1.66 2017/09/19 13:09:15 krw Exp $ */
/* BPF socket interface code, originally contributed by Archie Cobbs. */
@@ -249,7 +249,8 @@ send_packet(struct interface_info *ifi, struct in_addr from, struct in_addr to)
struct msghdr msg;
struct dhcp_packet *packet = &ifi->sent_packet;
ssize_t result;
- int iovcnt = 0, len = ifi->sent_packet_length;
+ unsigned int iovcnt = 0, i, total;
+ int len = ifi->sent_packet_length;
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
@@ -296,8 +297,19 @@ send_packet(struct interface_info *ifi, struct in_addr from, struct in_addr to)
iov[iovcnt].iov_len = len;
iovcnt++;
+ total = 0;
+ for (i = 0; i < iovcnt; i++)
+ total += iov[i].iov_len;
+
if (to.s_addr == INADDR_BROADCAST) {
result = writev(ifi->bfdesc, iov, iovcnt);
+ if (result == -1)
+ log_warn("%s: writev(bfdesc)", log_procname);
+ else if (result < total) {
+ result = -1;
+ log_warnx("%s, writev(bfdesc): %zd of %u bytes",
+ log_procname, result, total);
+ }
} else {
memset(&msg, 0, sizeof(msg));
msg.msg_name = (struct sockaddr *)&dest;
@@ -305,10 +317,15 @@ send_packet(struct interface_info *ifi, struct in_addr from, struct in_addr to)
msg.msg_iov = iov;
msg.msg_iovlen = iovcnt;
result = sendmsg(ifi->ufdesc, &msg, 0);
+ if (result == -1)
+ log_warn("%s: sendmsg(ufdesc)", log_procname);
+ else if (result < total) {
+ result = -1;
+ log_warnx("%s, sendmsg(ufdesc): %zd of %u bytes",
+ log_procname, result, total);
+ }
}
- if (result == -1)
- log_warn("%s: send_packet", log_procname);
return result;
}
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index a0fd214e456..d0f37017ba8 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.503 2017/09/18 00:00:57 krw Exp $ */
+/* $OpenBSD: dhclient.c,v 1.504 2017/09/19 13:09:15 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -1334,15 +1334,13 @@ send_discover(struct interface_info *ifi)
packet->secs = htons(UINT16_MAX);
ifi->secs = packet->secs;
- log_info("%s: DHCPDISCOVER - interval %lld", log_procname,
- (long long)ifi->interval);
rslt = send_packet(ifi, inaddr_any, inaddr_broadcast);
- if (rslt == -1 && errno == EAFNOSUPPORT) {
- log_warnx("%s: dhclient cannot be used", log_procname);
- quit = INTERNALSIG;
- } else
- set_timeout(ifi, ifi->interval, send_discover);
+ if (rslt != -1)
+ log_info("%s: DHCPDISCOVER - interval %lld", log_procname,
+ (long long)ifi->interval);
+
+ set_timeout(ifi, ifi->interval, send_discover);
}
/*
@@ -1377,6 +1375,7 @@ send_request(struct interface_info *ifi)
struct sockaddr_in destination;
struct in_addr from;
struct dhcp_packet *packet = &ifi->sent_packet;
+ ssize_t rslt;
time_t cur_time;
int interval;
@@ -1466,10 +1465,11 @@ send_request(struct interface_info *ifi)
packet->secs = htons(UINT16_MAX);
}
- log_info("%s: DHCPREQUEST to %s", log_procname,
- inet_ntoa(destination.sin_addr));
- send_packet(ifi, from, destination.sin_addr);
+ rslt = send_packet(ifi, from, destination.sin_addr);
+ if (rslt != -1)
+ log_info("%s: DHCPREQUEST to %s", log_procname,
+ inet_ntoa(destination.sin_addr));
set_timeout(ifi, ifi->interval, send_request);
}
@@ -1477,9 +1477,11 @@ send_request(struct interface_info *ifi)
void
send_decline(struct interface_info *ifi)
{
- log_info("%s: DHCPDECLINE", log_procname);
+ ssize_t rslt;
- send_packet(ifi, inaddr_any, inaddr_broadcast);
+ rslt = send_packet(ifi, inaddr_any, inaddr_broadcast);
+ if (rslt != -1)
+ log_info("%s: DHCPDECLINE", log_procname);
}
void