summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2012-11-02 20:21:33 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2012-11-02 20:21:33 +0000
commitce6956fdbc3041c37dbda5582856080cdb564cdd (patch)
tree098a8feab75c3ceb874008183d3fe014bae11c5e
parent7eeada6d61a9ac821aac2a7d162e619e5ddf267d (diff)
Avoid some misaligned access on sparc64 (at least) by bcopy()'ing
in_addr_t values into s_addr's rather than assigning them. Possibly not the ideal solution, but at least dhclient will work again on sparc64.
-rw-r--r--sbin/dhclient/kroute.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c
index 26fffe0c381..07625c8eaeb 100644
--- a/sbin/dhclient/kroute.c
+++ b/sbin/dhclient/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.3 2012/11/01 22:07:07 krw Exp $ */
+/* $OpenBSD: kroute.c,v 1.4 2012/11/02 20:21:32 krw Exp $ */
/*
* Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -562,6 +562,7 @@ priv_add_new_address(char *ifname, int rdomain, struct iaddr addr,
struct sockaddr_rtlabel label;
struct iovec iov[4];
struct sockaddr_in *in;
+ in_addr_t bozo;
int s, len, i, iovcnt = 0;
/*
@@ -578,13 +579,14 @@ priv_add_new_address(char *ifname, int rdomain, struct iaddr addr,
in = (struct sockaddr_in *) &ifaliasreq.ifra_addr;
in->sin_family = AF_INET;
in->sin_len = sizeof(ifaliasreq.ifra_addr);
- in->sin_addr.s_addr = inet_addr(piaddr(addr));
+ bozo = inet_addr(piaddr(addr));
+ bcopy(&bozo, &in->sin_addr.s_addr, sizeof(bozo));
/* And the netmask in ifra_mask. */
in = (struct sockaddr_in *) &ifaliasreq.ifra_mask;
in->sin_family = AF_INET;
in->sin_len = sizeof(ifaliasreq.ifra_mask);
- in->sin_addr.s_addr = mask;
+ bcopy(&mask, &in->sin_addr.s_addr, sizeof(mask));
/* No need to set broadcast address. Kernel can figure it out. */