? netipsec/o
Index: net/raw_cb.c
===================================================================
RCS file: /cvsroot/src/sys/net/raw_cb.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 raw_cb.c
--- net/raw_cb.c	19 May 2014 02:51:24 -0000	1.21
+++ net/raw_cb.c	21 May 2014 20:09:01 -0000
@@ -97,7 +97,7 @@ raw_attach(struct socket *so, int proto)
  * Detach the raw connection block and discard socket resources.
  */
 void
-raw_detach(struct socket *so)
+raw_detach1(struct socket *so, size_t sz)
 {
 	struct rawcb *rp = sotorawcb(so);
 
@@ -110,11 +110,17 @@ raw_detach(struct socket *so)
 
 	/* Note: sofree() drops the socket's lock. */
 	sofree(so);
-	kmem_free(rp, sizeof(*rp));
+	kmem_free(rp, sz);
 
 	mutex_enter(softnet_lock);
 }
 
+void
+raw_detach(struct socket *so)
+{
+	raw_detach1(so, sizeof(struct rawcb));
+}
+
 /*
  * Disconnect and possibly release resources.
  */
Index: net/raw_cb.h
===================================================================
RCS file: /cvsroot/src/sys/net/raw_cb.h,v
retrieving revision 1.21
diff -u -p -u -r1.21 raw_cb.h
--- net/raw_cb.h	19 May 2014 02:51:24 -0000	1.21
+++ net/raw_cb.h	21 May 2014 20:09:01 -0000
@@ -61,6 +61,7 @@ extern	struct	rawcbhead rawcb;		/* head 
 int	raw_attach(struct socket *, int);
 void	*raw_ctlinput(int, const struct sockaddr *, void *);
 void	raw_detach(struct socket *);
+void	raw_detach1(struct socket *, size_t);
 void	raw_disconnect(struct rawcb *);
 void	raw_init(void);
 void	raw_input(struct mbuf *, ...);
Index: netipsec/keysock.c
===================================================================
RCS file: /cvsroot/src/sys/netipsec/keysock.c,v
retrieving revision 1.24
diff -u -p -u -r1.24 keysock.c
--- netipsec/keysock.c	20 May 2014 19:04:00 -0000	1.24
+++ netipsec/keysock.c	21 May 2014 20:09:01 -0000
@@ -463,8 +463,8 @@ key_attach(struct socket *so, int proto,
 
 	if (sotorawcb(so) != 0)
 		return EISCONN;	/* XXX panic? */
-	kp = (struct keycb *)malloc(sizeof *kp, M_PCB, M_WAITOK|M_ZERO); /* XXX */
-	if (kp == 0)
+	kp = kmem_zalloc(sizeof(*kp), KM_SLEEP);
+	if (kp == NULL)
 		return ENOBUFS;
 
 	/*
@@ -479,7 +479,7 @@ key_attach(struct socket *so, int proto,
 	error = raw_usrreqs.pru_attach(so, proto, td);
 	kp = (struct keycb *)sotorawcb(so);
 	if (error) {
-		free(kp, M_PCB);
+		kmem_free(kp, sizeof(*kp));
 		so->so_pcb = NULL;
 		splx(s);
 		return error;
@@ -671,7 +671,7 @@ key_detach(struct socket *so)
 		key_cb.key_count--;
 	key_cb.any_count--;
 	key_freereg(so);
-	raw_detach(so);
+	raw_detach1(so, sizeof(*kp));
 	splx(s);
 }