Module Name:    src
Committed By:   rmind
Date:           Wed May 21 20:43:56 UTC 2014

Modified Files:
        src/sys/net: raw_cb.c raw_cb.h rtsock.c
        src/sys/netipsec: keysock.c

Log Message:
raw_detach: rawpcb may be embedded, free using the real size (saved in rcb).


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/net/raw_cb.c src/sys/net/raw_cb.h
cvs rdiff -u -r1.146 -r1.147 src/sys/net/rtsock.c
cvs rdiff -u -r1.24 -r1.25 src/sys/netipsec/keysock.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/raw_cb.c
diff -u src/sys/net/raw_cb.c:1.21 src/sys/net/raw_cb.c:1.22
--- src/sys/net/raw_cb.c:1.21	Mon May 19 02:51:24 2014
+++ src/sys/net/raw_cb.c	Wed May 21 20:43:56 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_cb.c,v 1.21 2014/05/19 02:51:24 rmind Exp $	*/
+/*	$NetBSD: raw_cb.c,v 1.22 2014/05/21 20:43:56 rmind Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_cb.c,v 1.21 2014/05/19 02:51:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_cb.c,v 1.22 2014/05/21 20:43:56 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -100,18 +100,19 @@ void
 raw_detach(struct socket *so)
 {
 	struct rawcb *rp = sotorawcb(so);
+	const size_t rcb_len = rp->rcb_len;
 
 	KASSERT(rp != NULL);
 	KASSERT(solocked(so));
 	KASSERT(so->so_lock == softnet_lock);	/* XXX */
 
-	LIST_REMOVE(rp, rcb_list);		/* remove last reference */
+	/* Remove the last reference. */
+	LIST_REMOVE(rp, rcb_list);
 	so->so_pcb = NULL;
 
 	/* Note: sofree() drops the socket's lock. */
 	sofree(so);
-	kmem_free(rp, sizeof(*rp));
-
+	kmem_free(rp, rcb_len);
 	mutex_enter(softnet_lock);
 }
 
Index: src/sys/net/raw_cb.h
diff -u src/sys/net/raw_cb.h:1.21 src/sys/net/raw_cb.h:1.22
--- src/sys/net/raw_cb.h:1.21	Mon May 19 02:51:24 2014
+++ src/sys/net/raw_cb.h	Wed May 21 20:43:56 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_cb.h,v 1.21 2014/05/19 02:51:24 rmind Exp $	*/
+/*	$NetBSD: raw_cb.h,v 1.22 2014/05/21 20:43:56 rmind Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -34,6 +34,8 @@
 #ifndef _NET_RAW_CB_H_
 #define _NET_RAW_CB_H_
 
+#ifdef _KERNEL
+
 /*
  * Raw protocol interface control block.  Used
  * to tie a socket to the generic raw interface.
@@ -44,6 +46,7 @@ struct rawcb {
 	struct	sockaddr *rcb_faddr;	/* destination address */
 	struct	sockaddr *rcb_laddr;	/* socket's address */
 	struct	sockproto rcb_proto;	/* protocol family, protocol */
+	size_t	rcb_len;
 };
 
 #define	sotorawcb(so)		((struct rawcb *)(so)->so_pcb)
@@ -54,7 +57,6 @@ struct rawcb {
 #define	RAWSNDQ		8192
 #define	RAWRCVQ		8192
 
-#ifdef _KERNEL
 LIST_HEAD(rawcbhead, rawcb);
 extern	struct	rawcbhead rawcb;		/* head of list */
 

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.146 src/sys/net/rtsock.c:1.147
--- src/sys/net/rtsock.c:1.146	Tue May 20 19:04:00 2014
+++ src/sys/net/rtsock.c	Wed May 21 20:43:56 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.146 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.147 2014/05/21 20:43:56 rmind Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.146 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.147 2014/05/21 20:43:56 rmind Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -184,6 +184,7 @@ COMPATNAME(route_attach)(struct socket *
 
 	KASSERT(sotorawcb(so) == NULL);
 	rp = kmem_zalloc(sizeof(*rp), KM_SLEEP);
+	rp->rcb_len = sizeof(*rp);
 	so->so_pcb = rp;
 
 	s = splsoftnet();

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.24 src/sys/netipsec/keysock.c:1.25
--- src/sys/netipsec/keysock.c:1.24	Tue May 20 19:04:00 2014
+++ src/sys/netipsec/keysock.c	Wed May 21 20:43:56 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.24 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: keysock.c,v 1.25 2014/05/21 20:43:56 rmind Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.24 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.25 2014/05/21 20:43:56 rmind Exp $");
 
 #include "opt_ipsec.h"
 
@@ -631,6 +631,7 @@ key_attach(struct socket *so, int proto)
 
 	KASSERT(sotorawcb(so) == NULL);
 	kp = kmem_zalloc(sizeof(*kp), KM_SLEEP);
+	kp->kp_raw.rcb_len = sizeof(*kp);
 	so->so_pcb = kp;
 
 	s = splsoftnet();

Reply via email to