I went through the FlexeLint output of the LINT kernel on i386 and
tried to examine all warnings about memoryleaks in central or
semi-central code.

I this patch I belive addresses the ones I think I could confirm,
in the following files:
        cam/scsi/scsi_cd.c
        cam/scsi/scsi_da.c
        dev/ata/ata-all.c
        fs/pseudofs/pseudofs_vncache.c
        fs/umapfs/umap_vfsops.c
        kern/kern_ktrace.c
        kern/kern_linker.c
        ufs/ufs/ufs_vnops.c

I would appreciate if the respective owners, authors, maintainers
etc would review and commit their own bits from this patch.

Thanks in advance!

Poul-Henning


Index: cam/scsi/scsi_cd.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_cd.c,v
retrieving revision 1.61
diff -u -r1.61 scsi_cd.c
--- cam/scsi/scsi_cd.c  28 Sep 2002 17:14:05 -0000      1.61
+++ cam/scsi/scsi_cd.c  30 Sep 2002 06:11:54 -0000
@@ -1463,6 +1463,7 @@
                start_ccb->ccb_h.ccb_bp = NULL;
                start_ccb->ccb_h.ccb_state = CD_CCB_PROBE;
                xpt_action(start_ccb);
+               /* XXX missing free(rcap, M_TEMP) ??? */
                break;
        }
        }
Index: cam/scsi/scsi_da.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_da.c,v
retrieving revision 1.108
diff -u -r1.108 scsi_da.c
--- cam/scsi/scsi_da.c  20 Sep 2002 19:35:52 -0000      1.108
+++ cam/scsi/scsi_da.c  30 Sep 2002 06:13:35 -0000
@@ -1249,6 +1249,7 @@
                start_ccb->ccb_h.ccb_bp = NULL;
                start_ccb->ccb_h.ccb_state = DA_CCB_PROBE;
                xpt_action(start_ccb);
+               /* XXX missing free(rcap, M_TEMP) ?? */
                break;
        }
        }
Index: dev/ata/ata-all.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ata/ata-all.c,v
retrieving revision 1.154
diff -u -r1.154 ata-all.c
--- dev/ata/ata-all.c   12 Sep 2002 14:32:33 -0000      1.154
+++ dev/ata/ata-all.c   30 Sep 2002 06:19:11 -0000
@@ -454,8 +454,10 @@
 
            if (iocmd->u.atapi.flags & ATAPI_CMD_WRITE) {
                error = copyin(iocmd->u.atapi.data, buf, iocmd->u.atapi.count);
-               if (error)
+               if (error) {
+                   free(buf, M_ATA);
                    return error;
+               }
            }
            error = atapi_queue_cmd(atadev, iocmd->u.atapi.ccb,
                                    buf, iocmd->u.atapi.count,
Index: fs/pseudofs/pseudofs_vncache.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/pseudofs/pseudofs_vncache.c,v
retrieving revision 1.17
diff -u -r1.17 pseudofs_vncache.c
--- fs/pseudofs/pseudofs_vncache.c      14 Sep 2002 09:02:24 -0000      1.17
+++ fs/pseudofs/pseudofs_vncache.c      30 Sep 2002 06:23:59 -0000
@@ -136,8 +136,10 @@
        if (++pfs_vncache_entries > pfs_vncache_maxentries)
                pfs_vncache_maxentries = pfs_vncache_entries;
        error = getnewvnode("pseudofs", mp, pfs_vnodeop_p, vpp);
-       if (error)
+       if (error) {
+               FREE(pvd, M_PFSVNCACHE);
                return (error);
+       }
        pvd->pvd_pn = pn;
        pvd->pvd_pid = pid;
        (*vpp)->v_data = pvd;
Index: fs/umapfs/umap_vfsops.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/umapfs/umap_vfsops.c,v
retrieving revision 1.46
diff -u -r1.46 umap_vfsops.c
--- fs/umapfs/umap_vfsops.c     4 Aug 2002 10:29:31 -0000       1.46
+++ fs/umapfs/umap_vfsops.c     30 Sep 2002 06:26:18 -0000
@@ -170,6 +170,8 @@
        if (args.nentries > MAPFILEENTRIES || args.gnentries >
            GMAPFILEENTRIES) {
                vput(lowerrootvp);
+               free(amp, M_UMAPFSMNT);
+               /* XXX missing error = EINVAL ? */
                return (error);
        }
 
@@ -177,8 +179,10 @@
        amp->info_gnentries = args.gnentries;
        error = copyin(args.mapdata, (caddr_t)amp->info_mapdata,
            2*sizeof(u_long)*args.nentries);
-       if (error)
+       if (error) {
+               free(amp, M_UMAPFSMNT);
                return (error);
+       }
 
 #ifdef DEBUG
        printf("umap_mount:nentries %d\n",args.nentries);
@@ -189,8 +193,10 @@
 
        error = copyin(args.gmapdata, (caddr_t)amp->info_gmapdata,
            2*sizeof(u_long)*args.gnentries);
-       if (error)
+       if (error) {
+               free(amp, M_UMAPFSMNT);
                return (error);
+       }
 
 #ifdef DEBUG
        printf("umap_mount:gnentries %d\n",args.gnentries);
Index: kern/kern_ktrace.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_ktrace.c,v
retrieving revision 1.77
diff -u -r1.77 kern_ktrace.c
--- kern/kern_ktrace.c  11 Sep 2002 21:00:56 -0000      1.77
+++ kern/kern_ktrace.c  30 Sep 2002 06:35:00 -0000
@@ -325,8 +325,11 @@
                bcopy(args, buf, buflen);
        }
        req = ktr_getrequest(KTR_SYSCALL);
-       if (req == NULL)
+       if (req == NULL) {
+               if (buf != NULL)
+                       free(buf, M_KTRACE);
                return;
+       }
        ktp = &req->ktr_data.ktr_syscall;
        ktp->ktr_code = code;
        ktp->ktr_narg = narg;
@@ -372,8 +375,11 @@
                bcopy(path, buf, namelen);
        }
        req = ktr_getrequest(KTR_NAMEI);
-       if (req == NULL)
+       if (req == NULL) {
+               if (buf != NULL)
+                       free(buf, M_KTRACE);
                return;
+       }
        if (namelen > 0) {
                req->ktr_header.ktr_len = namelen;
                req->ktr_header.ktr_buffer = buf;
@@ -621,11 +627,15 @@
                return (EINVAL);
        cp = malloc(uap->len, M_KTRACE, M_WAITOK);
        error = copyin(uap->addr, cp, uap->len);
-       if (error)
+       if (error) {
+               free(cp, M_KTRACE);
                return (error);
+       }
        req = ktr_getrequest(KTR_USER);
-       if (req == NULL)
+       if (req == NULL) {
+               free(cp, M_KTRACE);
                return (0);
+       }
        req->ktr_header.ktr_buffer = cp;
        req->ktr_header.ktr_len = uap->len;
        ktr_submitrequest(req);
Index: kern/kern_linker.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_linker.c,v
retrieving revision 1.94
diff -u -r1.94 kern_linker.c
--- kern/kern_linker.c  15 Aug 2002 20:55:03 -0000      1.94
+++ kern/kern_linker.c  30 Sep 2002 06:36:15 -0000
@@ -1531,6 +1531,7 @@
                printf("warning: KLD '%s' is newer than the linker.hints"
                    " file\n", result);
 bad:
+       free(pathbuf, M_LINKER);
        if (hints)
                free(hints, M_TEMP);
        if (nd.ni_vp != NULL) {
Index: ufs/ufs/ufs_vnops.c
===================================================================
RCS file: /home/ncvs/src/sys/ufs/ufs/ufs_vnops.c,v
retrieving revision 1.210
diff -u -r1.210 ufs_vnops.c
--- ufs/ufs/ufs_vnops.c 28 Sep 2002 17:15:31 -0000      1.210
+++ ufs/ufs/ufs_vnops.c 30 Sep 2002 07:06:33 -0000
@@ -1480,6 +1480,8 @@
        default:
                UFS_VFREE(tvp, ip->i_number, dmode);
                vput(tvp);
+               FREE(acl, M_ACL);
+               FREE(dacl, M_ACL);
                return (error);
        }
 #else /* !UFS_ACL */
@@ -2381,6 +2383,8 @@
        default:
                UFS_VFREE(tvp, ip->i_number, mode);
                vput(tvp);
+               FREE(acl, M_ACL);
+               acl = NULL;
                return (error);
        }
 #else /* !UFS_ACL */

-- 
Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
[EMAIL PROTECTED]         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe
Never attribute to malice what can adequately be explained by incompetence.

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to