From b99760ab51abf8c4c9a1f89dab0c1630a6768ff7 Mon Sep 17 00:00:00 2001 From: ajs Date: Tue, 4 Jan 2005 16:24:43 +0000 Subject: 2005-01-04 Andrew J. Schorr * configure.ac: Added test for broken CMSG_FIRSTHDR macro (relevant for Solaris 8 and unpatched Solaris 9, don't know whether other platforms are affected). * zebra.h: Define ZCMSG_FIRSTHDR appropriately based on whether config.h indicates HAVE_BROKEN_CMSG_FIRSTHDR (as determined by the configure test program). * sockopt.c: (getsockopt_cmsg_data) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR. * rtadv.c: (rtadv_recv_packet,rtadv_send_packet) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR. * ripd.c: (rip_recvmsg) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR. * ripngd.c: (ripng_recv_packet) Use ZCMSG_FIRSTHDR instead of CMSG_FIRSTHDR. --- lib/ChangeLog | 8 ++++++++ lib/sockopt.c | 2 +- lib/zebra.h | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/ChangeLog b/lib/ChangeLog index d50b8590..2fee4611 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,11 @@ +2005-01-04 Andrew J. Schorr + + * zebra.h: Define ZCMSG_FIRSTHDR appropriately based on whether + config.h indicates HAVE_BROKEN_CMSG_FIRSTHDR (as determined + by the configure test program). + * sockopt.c: (getsockopt_cmsg_data) Use ZCMSG_FIRSTHDR instead + of CMSG_FIRSTHDR. + 2005-01-02 Hasso Tepper * command.c: Revert int -> unsigned int fixes in diff --git a/lib/sockopt.c b/lib/sockopt.c index d755746a..81db88d9 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -42,7 +42,7 @@ getsockopt_cmsg_data (struct msghdr *msgh, int level, int type) struct cmsghdr *cmsg; void *ptr = NULL; - for (cmsg = CMSG_FIRSTHDR(msgh); + for (cmsg = ZCMSG_FIRSTHDR(msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(msgh, cmsg)) if (cmsg->cmsg_level == level && cmsg->cmsg_type) diff --git a/lib/zebra.h b/lib/zebra.h index 83da37c5..8c2dcaba 100644 --- a/lib/zebra.h +++ b/lib/zebra.h @@ -215,6 +215,23 @@ typedef int socklen_t; #endif /* BSDI_NRL */ +#ifdef HAVE_BROKEN_CMSG_FIRSTHDR +/* This bug is present in Solaris 8 and pre-patch Solaris 9 ; + please refer to http://bugzilla.quagga.net/show_bug.cgi?id=142 */ + +/* Check that msg_controllen is large enough. */ +#define ZCMSG_FIRSTHDR(mhdr) \ + (((size_t)((mhdr)->msg_controllen) >= sizeof(struct cmsghdr)) ? \ + CMSG_FIRSTHDR(mhdr) : (struct cmsghdr *)NULL) + +#warning "CMSG_FIRSTHDR is broken on this platform, using a workaround" + +#else /* HAVE_BROKEN_CMSG_FIRSTHDR */ +#define ZCMSG_FIRSTHDR(M) CMSG_FIRSTHDR(M) +#endif /* HAVE_BROKEN_CMSG_FIRSTHDR */ + + + /* * RFC 3542 defines several macros for using struct cmsghdr. * Here, we define those that are not present -- cgit v1.2.1