summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/raw_ip6.c
diff options
context:
space:
mode:
authorups <ups@FreeBSD.org>2006-07-18 22:34:27 +0000
committerups <ups@FreeBSD.org>2006-07-18 22:34:27 +0000
commitee0a5eb928ae5ccdf1a0e619b4ba6e93d19db5fb (patch)
tree2e39fd9d815a6efa63bdabd6bfed00c38e05310a /sys/netinet6/raw_ip6.c
parent9adb8df4815a901cfc690d567d4ba0b6c63b1d5d (diff)
downloadFreeBSD-src-ee0a5eb928ae5ccdf1a0e619b4ba6e93d19db5fb.zip
FreeBSD-src-ee0a5eb928ae5ccdf1a0e619b4ba6e93d19db5fb.tar.gz
Fix race conditions on enumerating pcb lists by moving the initialization
( and where appropriate the destruction) of the pcb mutex to the init/finit functions of the pcb zones. This allows locking of the pcb entries and race condition free comparison of the generation count. Rearrange locking a bit to avoid extra locking operation to update the generation count in in_pcballoc(). (in_pcballoc now returns the pcb locked) I am planning to convert pcb list handling from a type safe to a reference count model soon. ( As this allows really freeing the PCBs) Reviewed by: rwatson@, mohans@ MFC after: 1 week
Diffstat (limited to 'sys/netinet6/raw_ip6.c')
-rw-r--r--sys/netinet6/raw_ip6.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 111f525..86ff948 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -561,14 +561,13 @@ rip6_attach(struct socket *so, int proto, struct thread *td)
if (filter == NULL)
return ENOMEM;
INP_INFO_WLOCK(&ripcbinfo);
- error = in_pcballoc(so, &ripcbinfo, "raw6inp");
+ error = in_pcballoc(so, &ripcbinfo);
if (error) {
INP_INFO_WUNLOCK(&ripcbinfo);
FREE(filter, M_PCB);
return error;
}
inp = (struct inpcb *)so->so_pcb;
- INP_LOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
inp->inp_vflag |= INP_IPV6;
inp->in6p_ip6_nxt = (long)proto;
OpenPOWER on IntegriCloud