changeset 3796:3dc60af20942

6528779 mdb findleaks reports memory leak in ipfilter
author zf203873
date Fri, 09 Mar 2007 21:22:16 -0800
parents 4204ffa31717
children 2436612507a3
files usr/src/uts/common/inet/ipf/fil.c usr/src/uts/common/inet/ipf/ip_htable.c usr/src/uts/common/inet/ipf/ip_nat.c usr/src/uts/common/inet/ipf/ip_pool.c usr/src/uts/common/inet/ipf/netinet/ip_fil.h
diffstat 5 files changed, 49 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/inet/ipf/fil.c	Fri Mar 09 17:41:22 2007 -0800
+++ b/usr/src/uts/common/inet/ipf/fil.c	Fri Mar 09 21:22:16 2007 -0800
@@ -6628,7 +6628,7 @@
 	return error;
 }
 
-static void ipf_unlinktoken(token, ifs)
+void ipf_unlinktoken(token, ifs)
 ipftoken_t *token;
 ipf_stack_t *ifs;
 {
@@ -6785,14 +6785,14 @@
 	if (next != NULL) {
 		if (next->fr_next == NULL) {
 			t->ipt_alive = 0;
-			/*ipf_freetoken(t, ifs);
-			fr = NULL; */
+			ipf_unlinktoken(t, ifs);
+			KFREE(t);	
 		} else {
 			MUTEX_ENTER(&next->fr_lock);
 			next->fr_ref++;
 			MUTEX_EXIT(&next->fr_lock);
+			t->ipt_data = next;
 		}
-		t->ipt_data = next;
 	} else {
 		bzero(&zero, sizeof(zero));
 		next = &zero;
--- a/usr/src/uts/common/inet/ipf/ip_htable.c	Fri Mar 09 17:41:22 2007 -0800
+++ b/usr/src/uts/common/inet/ipf/ip_htable.c	Fri Mar 09 21:22:16 2007 -0800
@@ -668,14 +668,17 @@
 		}
 
 		if (nextiph != NULL) {
-			if (nextiph->iph_next == NULL)
+			if (nextiph->iph_next == NULL) {
 				token->ipt_alive = 0;
-			else {
+				ipf_unlinktoken(token, ifs);
+				KFREE(token);
+			} else {
 				ATOMIC_INC(nextiph->iph_ref);
 			}
 		} else {
 			bzero((char *)&zp, sizeof(zp));
 			nextiph = &zp;
+			ipf_freetoken(token, ifs);
 		}
 		break;
 
@@ -693,14 +696,17 @@
 		}
 
 		if (nextnode != NULL) {
-			if (nextnode->ipe_snext == NULL)
+			if (nextnode->ipe_snext == NULL) {
 				token->ipt_alive = 0;
-			else {
+				ipf_unlinktoken(token, ifs);
+				KFREE(token);
+			} else {
 				ATOMIC_INC(nextnode->ipe_ref);
 			}
 		} else {
 			bzero((char *)&zn, sizeof(zn));
 			nextnode = &zn;
+			ipf_freetoken(token, ifs);
 		}
 		break;
 	default :
@@ -720,7 +726,9 @@
 			fr_derefhtable(iph, ifs);
 			RWLOCK_EXIT(&ifs->ifs_ip_poolrw);
 		}
-		token->ipt_data = nextiph;
+		if (nextiph->iph_next != NULL) 
+			token->ipt_data = nextiph;
+		
 		err = COPYOUT(nextiph, ilp->ili_data, sizeof(*nextiph));
 		if (err != 0)
 			err = EFAULT;
@@ -732,7 +740,8 @@
 			fr_derefhtent(node);
 			RWLOCK_EXIT(&ifs->ifs_ip_poolrw);
 		}
-		token->ipt_data = nextnode;
+		if (nextnode->ipe_snext != NULL) 
+			token->ipt_data = nextnode;
 		err = COPYOUT(nextnode, ilp->ili_data, sizeof(*nextnode));
 		if (err != 0)
 			err = EFAULT;
--- a/usr/src/uts/common/inet/ipf/ip_nat.c	Fri Mar 09 17:41:22 2007 -0800
+++ b/usr/src/uts/common/inet/ipf/ip_nat.c	Fri Mar 09 21:22:16 2007 -0800
@@ -5022,8 +5022,8 @@
 		if (nexthm != NULL) {
 			if (nexthm->hm_hnext == NULL) {
 				t->ipt_alive = 0;
-				/* ipf_freetoken(t, ifs);
-				hm = NULL; */
+				ipf_unlinktoken(t, ifs);
+				KFREE(t);
 			} else {
 				/*MUTEX_ENTER(&nexthm->hm_lock);*/
 				nexthm->hm_ref++;
@@ -5033,6 +5033,7 @@
 		} else {
 			bzero(&zerohm, sizeof(zerohm));
 			nexthm = &zerohm;
+			ipf_freetoken(t, ifs);
 		}
 		break;
 
@@ -5046,8 +5047,8 @@
 		if (nextipnat != NULL) {
 			if (nextipnat->in_next == NULL) {
 				t->ipt_alive = 0;
-				/*ipf_freetoken(t, ifs);
-				ipn = NULL;*/
+				ipf_unlinktoken(t, ifs);
+				KFREE(t);
 			} else {
 				/* MUTEX_ENTER(&nextipnat->in_lock); */
 				nextipnat->in_use++;
@@ -5056,6 +5057,7 @@
 		} else {
 			bzero(&zeroipn, sizeof(zeroipn));
 			nextipnat = &zeroipn;
+			ipf_freetoken(t, ifs);
 		}
 		break;
 
@@ -5069,8 +5071,8 @@
 		if (nextnat != NULL) {
 			if (nextnat->nat_next == NULL) {
 				t->ipt_alive = 0;
-				/*ipf_freetoken(t, ifs);
-				nat = NULL;*/
+				ipf_unlinktoken(t, ifs);
+				KFREE(t);
 			} else {
 				MUTEX_ENTER(&nextnat->nat_lock);
 				nextnat->nat_ref++;
@@ -5079,6 +5081,7 @@
 		} else {
 			bzero(&zeronat, sizeof(zeronat));
 			nextnat = &zeronat;
+			ipf_freetoken(t, ifs);
 		}
 		break;
 	}
@@ -5093,7 +5096,8 @@
 			fr_hostmapderef(&hm);
 			RWLOCK_EXIT(&ifs->ifs_ipf_nat);
 		}
-		t->ipt_data = nexthm;
+		if (nexthm->hm_hnext != NULL) 
+			t->ipt_data = nexthm;
 		error = COPYOUT(nexthm, itp->igi_data, sizeof(*nexthm));
 		if (error != 0)
 			error = EFAULT;
@@ -5102,7 +5106,8 @@
 	case IPFGENITER_IPNAT :
 		if (ipn != NULL)
 			fr_ipnatderef(&ipn, ifs);
-		t->ipt_data = nextipnat;
+		if (nextipnat->in_next != NULL) 
+			t->ipt_data = nextipnat;
 		error = COPYOUT(nextipnat, itp->igi_data, sizeof(*nextipnat));
 		if (error != 0)
 			error = EFAULT;
@@ -5111,7 +5116,8 @@
 	case IPFGENITER_NAT :
 		if (nat != NULL)
 			fr_natderef(&nat, ifs);
-		t->ipt_data = nextnat;
+		if (nextnat->nat_next != NULL) 
+			t->ipt_data = nextnat;
 		error = COPYOUT(nextnat, itp->igi_data, sizeof(*nextnat));
 		if (error != 0)
 			error = EFAULT;
--- a/usr/src/uts/common/inet/ipf/ip_pool.c	Fri Mar 09 17:41:22 2007 -0800
+++ b/usr/src/uts/common/inet/ipf/ip_pool.c	Fri Mar 09 21:22:16 2007 -0800
@@ -785,14 +785,17 @@
 		}
 
 		if (nextipo != NULL) {
-			if (nextipo->ipo_next == NULL)
+			if (nextipo->ipo_next == NULL) {
 				token->ipt_alive = 0;
-			else {
+				ipf_unlinktoken(token, ifs);
+				KFREE(token);
+			} else {
 				ATOMIC_INC(nextipo->ipo_ref);
 			}
 		} else {
 			bzero((char *)&zp, sizeof(zp));
 			nextipo = &zp;
+			ipf_freetoken(token, ifs);
 		}
 		break;
 
@@ -811,14 +814,17 @@
 		}
 
 		if (nextnode != NULL) {
-			if (nextnode->ipn_next == NULL)
+			if (nextnode->ipn_next == NULL) {
 				token->ipt_alive = 0;
-			else {
+				ipf_unlinktoken(token, ifs);
+				KFREE(token);
+			} else {
 				ATOMIC_INC(nextnode->ipn_ref);
 			}
 		} else {
 			bzero((char *)&zn, sizeof(zn));
 			nextnode = &zn;
+			ipf_freetoken(token, ifs);
 		}
 		break;
 	default :
@@ -839,7 +845,8 @@
 			ip_pool_deref(ipo, ifs);
 			RWLOCK_EXIT(&ifs->ifs_ip_poolrw);
 		}
-		token->ipt_data = nextipo;
+		if (nextipo->ipo_next != NULL) 
+			token->ipt_data = nextipo;
 		err = COPYOUT(nextipo, ilp->ili_data, sizeof(*nextipo));
 		if (err != 0)
 			err = EFAULT;
@@ -851,7 +858,8 @@
 			ip_pool_node_deref(node, ifs);
 			RWLOCK_EXIT(&ifs->ifs_ip_poolrw);
 		}
-		token->ipt_data = nextnode;
+		if (nextnode->ipn_next != NULL) 
+			token->ipt_data = nextnode;
 		err = COPYOUT(nextnode, ilp->ili_data, sizeof(*nextnode));
 		if (err != 0)
 			err = EFAULT;
--- a/usr/src/uts/common/inet/ipf/netinet/ip_fil.h	Fri Mar 09 17:41:22 2007 -0800
+++ b/usr/src/uts/common/inet/ipf/netinet/ip_fil.h	Fri Mar 09 21:22:16 2007 -0800
@@ -1467,6 +1467,7 @@
 extern  ipftoken_t      *ipf_findtoken __P((int, int, void *, ipf_stack_t *));
 extern  int             ipf_getnextrule __P((ipftoken_t *, void *, ipf_stack_t *));
 extern  void            ipf_expiretokens __P((ipf_stack_t *));
+extern  void            ipf_unlinktoken __P((ipftoken_t *, ipf_stack_t *));
 extern  void            ipf_freetoken __P((ipftoken_t *, ipf_stack_t *));
 extern  int             ipf_deltoken __P((int,int, void *, ipf_stack_t *));
 extern  int             ipf_genericiter __P((void *, int, void *, ipf_stack_t *));