summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
authorDoug VanLeuven <roamdad@sonic.net>2012-10-10 22:10:14 +0000
committerDavid Lamparter <equinox@opensourcerouting.org>2012-11-05 11:11:36 -0500
commit3b33de676ac8e84b82f40520ecd0f4722e16b349 (patch)
tree28b0d91a6d3946ac244f7784274196a43c8fe0b9 /zebra
parent7d50ad444ffadd4110152113cc9583db96b3ad67 (diff)
zebra: kernel_socket: fix 64bit MacOS X alignment
In OS X 10.7 zebra crashed on invalid execution address. sockaddr padding in *_msghdr is observed to be 4 bytes in 64bit OS X. The ROUNDUP macro assumed alignment on sizeof(long) which allocates 8 bytes on 64bit systems, 4 bytes on 32bit systems which is true for BSD generally. Test for Apple and use sizeof(int) which allocates 4 bytes on 32 & 64bit systems. Tested on 64bit OS X 10.7, FreeBSD 9.0 amd64 & i386 (32bit) using gcc & clang Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/kernel_socket.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index b7061e76..ecc6e790 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -48,9 +48,15 @@ extern struct zebra_t zebrad;
* XXX: why is ROUNDUP(0) sizeof(long)? 0 is an illegal sockaddr
* length anyway (< sizeof (struct sockaddr)), so this shouldn't
* matter.
+ * On OS X, both 32, 64bit syatems align on 4 byte boundary
*/
+#ifdef __APPLE__
+#define ROUNDUP(a) \
+ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(int) - 1))) : sizeof(int))
+#else
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
+#endif
/*
* Given a pointer (sockaddr or void *), return the number of bytes