Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Feb 2005 15:27:27 +0100 (CET)
From:      Antoine Brodin <antoine.brodin@laposte.net>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/78072: [Patch] Potential memory leak in lge(4)
Message-ID:  <200502251427.j1PERRxm019221@barton.dreadbsd.org>
Resent-Message-ID: <200502251430.j1PEUINo076216@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         78072
>Category:       kern
>Synopsis:       [Patch] Potential memory leak in lge(4)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 25 14:30:17 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Antoine Brodin
>Release:        FreeBSD 6.0-CURRENT i386
>Organization:
none
>Environment:
System: FreeBSD barton.dreadbsd.org 6.0-CURRENT FreeBSD 6.0-CURRENT #0: Thu Feb 24 14:18:22 CET 2005 antoine@barton.dreadbsd.org:/usr/obj/usr/src/sys/BARTON i386
>Description:
If malloc(9) fails line 791 of if_lge.c, the jumbo buffer block and the
free jumbo list entries already allocated will be leaked.
>How-To-Repeat:
I haven't got any lge(4) NIC.
>Fix:

Patch attached:

--- if_lge.diff begins here ---
Index: dev/lge/if_lge.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/lge/if_lge.c,v
retrieving revision 1.36
diff -u -p -r1.36 if_lge.c
--- dev/lge/if_lge.c	6 Jan 2005 01:42:53 -0000	1.36
+++ dev/lge/if_lge.c	25 Feb 2005 12:24:46 -0000
@@ -791,6 +791,7 @@ lge_alloc_jumbo_mem(sc)
 		entry = malloc(sizeof(struct lge_jpool_entry), 
 		    M_DEVBUF, M_NOWAIT);
 		if (entry == NULL) {
+			lge_free_jumbo_mem(sc);
 			printf("lge%d: no memory for jumbo "
 			    "buffer queue!\n", sc->lge_unit);
 			return(ENOBUFS);
@@ -807,10 +808,9 @@ static void
 lge_free_jumbo_mem(sc)
 	struct lge_softc	*sc;
 {
-	int			i;
 	struct lge_jpool_entry	*entry;
 
-	for (i = 0; i < LGE_JSLOTS; i++) {
+	while (!SLIST_EMPTY(&sc->lge_jfree_listhead)) {
 		entry = SLIST_FIRST(&sc->lge_jfree_listhead);
 		SLIST_REMOVE_HEAD(&sc->lge_jfree_listhead, jpool_entries);
 		free(entry, M_DEVBUF);
--- if_lge.diff ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200502251427.j1PERRxm019221>