summaryrefslogtreecommitdiff
path: root/lib/sockopt.c
diff options
context:
space:
mode:
authorgdt <gdt>2004-12-29 18:53:30 +0000
committergdt <gdt>2004-12-29 18:53:30 +0000
commit1d69fdf645d8434e8e1488f8bf0c73613df09da9 (patch)
treec3612df88e349556c1570d7d2ce0b37ce590ea5d /lib/sockopt.c
parent3cade26fea2febf99780288d31d0bfe7e1b16ef1 (diff)
2004-12-29 Greg Troxel <gdt@poblano.ir.bbn.com>
* 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.
Diffstat (limited to 'lib/sockopt.c')
-rw-r--r--lib/sockopt.c22
1 files changed, 22 insertions, 0 deletions
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);