kern/77685: Little memory leak in devfs
Antoine Brodin
antoine.brodin at laposte.net
Fri Feb 18 17:30:17 GMT 2005
>Number: 77685
>Category: kern
>Synopsis: Little memory leak in devfs
>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 18 17:30:16 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 #1: Fri Feb 18 17:40:26 CET 2005 antoine at barton.dreadbsd.org:/usr/obj/usr/src/sys/BARTON i386
>Description:
There's a little leak in devfs: when destroying a device created by
make_dev_alias, the symlink is leaked.
When using MAC, the MAC label is probably leaked too but I don't use
MAC so somebody who uses MAC should test it.
>How-To-Repeat:
The is an easy way to reproduce and to see this leak:
celeron# vmstat -m | grep DEVFS
DEVFS 136 20K 20K 245 16,32,128,4096
celeron# ifconfig lo1 create
celeron# ls /dev
celeron# vmstat -m | grep DEVFS
DEVFS 139 20K 20K 248 16,32,128,4096
celeron# ifconfig lo1 destroy
celeron# ls /dev
celeron# vmstat -m | grep DEVFS
DEVFS 137 20K 20K 248 16,32,128,4096
On a patched box:
barton# vmstat -m | grep DEVFS
DEVFS 162 23K 23K 166 16,32,128,4096
barton# ifconfig lo1 create
barton# ls /dev
barton# vmstat -m | grep DEVFS
DEVFS 165 23K 23K 169 16,32,128,4096
barton# ifconfig lo1 destroy
barton# ls /dev
barton# vmstat -m | grep DEVFS
DEVFS 162 23K 23K 169 16,32,128,4096
>Fix:
Apply the attached patch, the MAC part is untested.
--- devfs_devs.diff begins here ---
Index: devfs_devs.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/devfs/devfs_devs.c,v
retrieving revision 1.33
diff -u -p -r1.33 devfs_devs.c
--- devfs_devs.c 10 Feb 2005 12:22:17 -0000 1.33
+++ devfs_devs.c 18 Feb 2005 16:53:59 -0000
@@ -270,10 +270,7 @@ devfs_populate(struct devfs_mount *dm)
if (dev == NULL && de != NULL) {
dd = de->de_dir;
*dep = NULL;
- TAILQ_REMOVE(&dd->de_dlist, de, de_list);
- if (de->de_vnode)
- de->de_vnode->v_data = NULL;
- FREE(de, M_DEVFS);
+ devfs_delete(dd, de);
devfs_dropref(i);
continue;
}
--- devfs_devs.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list