Limit scope of acquisition of INP_RLOCK for multicast input filter

to the scope of its use, even though this may thrash the lock if
the INP is referenced for other purposes.

Tested by:	David Wolfskill
This commit is contained in:
bms 2009-05-01 11:05:24 +00:00
parent d194ae9d52
commit 100613163b

View File

@ -279,8 +279,6 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
continue;
}
INP_RLOCK(inp);
/*
* Handle socket delivery policy for any-source
* and source-specific multicast. [RFC3678]
@ -290,6 +288,8 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
struct sockaddr_in6 mcaddr;
int blocked;
INP_RLOCK(inp);
bzero(&mcaddr, sizeof(struct sockaddr_in6));
mcaddr.sin6_len = sizeof(struct sockaddr_in6);
mcaddr.sin6_family = AF_INET6;
@ -304,9 +304,11 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
if (blocked == MCAST_NOTSMEMBER ||
blocked == MCAST_MUTED)
UDPSTAT_INC(udps_filtermcast);
INP_RUNLOCK(inp);
INP_RUNLOCK(inp); /* XXX */
continue;
}
INP_RUNLOCK(inp);
}
if (last != NULL) {
struct mbuf *n;
@ -423,8 +425,6 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
return (IPPROTO_DONE);
badheadlocked:
if (inp)
INP_RUNLOCK(inp);
INP_INFO_RUNLOCK(&V_udbinfo);
badunlocked:
if (m)