From 1d69fdf645d8434e8e1488f8bf0c73613df09da9 Mon Sep 17 00:00:00 2001 From: gdt Date: Wed, 29 Dec 2004 18:53:30 +0000 Subject: 2004-12-29 Greg Troxel * sockopt.c (getsockopt_ipv4_ifindex): Return 0 when passed a NULL cmsghdr pointer. I believe this will avoid ospfd crashing on Solaris 8, which seems to define IP_RECVIF but not actually implement it. --- lib/ChangeLog | 5 +++++ lib/sockopt.c | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/lib/ChangeLog b/lib/ChangeLog index eaf459de..6f236372 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,8 @@ +2004-12-29 Greg Troxel + + * sockopt.c (getsockopt_ipv4_ifindex): Return 0 when passed a NULL + cmsghdr pointer. + 2004-12-28 Andrew J. Schorr * sockopt.c: (setsockopt_ipv4_ifindex) Improve error message. diff --git a/lib/sockopt.c b/lib/sockopt.c index 3a8033cc..8c518f82 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -283,11 +283,30 @@ setsockopt_ifindex (int af, int sock, int val) static int getsockopt_ipv4_ifindex (struct msghdr *msgh) { + /* + * XXX: This routine's semantics are ill-defined, in particular how + * the results "can't determine interface due to runtime behavior" + * and "OS has no support for how to determine behavior" are + * encoded. For now, return 0 for either case; caller must handle + * as "don't know". + */ int ifindex = -1; + + /* + * If autoconf found a method to get ifindex, but it didn't work for + * this packet, or on this OS, this routine can be entered with a + * NULL cmsghdr pointer. Check msgh before using in each case + * below, rather than here, to avoid having to ifdef twice, once for + * declarations and once for code. + */ + #if defined(IP_PKTINFO) /* Linux pktinfo based ifindex retrieval */ struct in_pktinfo *pktinfo; + if (msgh == NULL) + return 0; + pktinfo = (struct in_pktinfo *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_PKTINFO); ifindex = pktinfo->ipi_ifindex; @@ -300,6 +319,9 @@ getsockopt_ipv4_ifindex (struct msghdr *msgh) #endif /* SUNOS_5 */ /* SUNOS_5 doesn't need a structure to extract ifindex */ + if (msgh == NULL) + return 0; + #ifndef SUNOS_5 sdl = (struct sockaddr_dl *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_RECVIF); -- cgit v1.2.1