mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-15 07:32:48 +00:00
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.
This commit is contained in:
parent
3cade26fea
commit
1d69fdf645
@ -1,3 +1,8 @@
|
|||||||
|
2004-12-29 Greg Troxel <gdt@poblano.ir.bbn.com>
|
||||||
|
|
||||||
|
* sockopt.c (getsockopt_ipv4_ifindex): Return 0 when passed a NULL
|
||||||
|
cmsghdr pointer.
|
||||||
|
|
||||||
2004-12-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
|
2004-12-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
|
||||||
|
|
||||||
* sockopt.c: (setsockopt_ipv4_ifindex) Improve error message.
|
* sockopt.c: (setsockopt_ipv4_ifindex) Improve error message.
|
||||||
|
@ -283,11 +283,30 @@ setsockopt_ifindex (int af, int sock, int val)
|
|||||||
static int
|
static int
|
||||||
getsockopt_ipv4_ifindex (struct msghdr *msgh)
|
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;
|
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)
|
#if defined(IP_PKTINFO)
|
||||||
/* Linux pktinfo based ifindex retrieval */
|
/* Linux pktinfo based ifindex retrieval */
|
||||||
struct in_pktinfo *pktinfo;
|
struct in_pktinfo *pktinfo;
|
||||||
|
|
||||||
|
if (msgh == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
pktinfo =
|
pktinfo =
|
||||||
(struct in_pktinfo *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_PKTINFO);
|
(struct in_pktinfo *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_PKTINFO);
|
||||||
ifindex = pktinfo->ipi_ifindex;
|
ifindex = pktinfo->ipi_ifindex;
|
||||||
@ -300,6 +319,9 @@ getsockopt_ipv4_ifindex (struct msghdr *msgh)
|
|||||||
#endif /* SUNOS_5 */
|
#endif /* SUNOS_5 */
|
||||||
/* SUNOS_5 doesn't need a structure to extract ifindex */
|
/* SUNOS_5 doesn't need a structure to extract ifindex */
|
||||||
|
|
||||||
|
if (msgh == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
#ifndef SUNOS_5
|
#ifndef SUNOS_5
|
||||||
sdl =
|
sdl =
|
||||||
(struct sockaddr_dl *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_RECVIF);
|
(struct sockaddr_dl *)getsockopt_cmsg_data (msgh, IPPROTO_IP, IP_RECVIF);
|
||||||
|
Loading…
Reference in New Issue
Block a user