Module Name:    src
Committed By:   uebayasi
Date:           Thu Jan 28 14:25:17 UTC 2010

Modified Files:
        src/sys/miscfs/genfs: genfs_io.c

Log Message:
Revert part which variable initializations within interleaved gotos.

again:  if (...) goto err;
        void *ptr = alloc();
        if (...) goto again;
        if (...) goto err1;
        ...
err1:   if (ptr) free(ptr);
err:
        return;

This leaks memory if exited with "goto again; -> goto err;".


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.31 src/sys/miscfs/genfs/genfs_io.c:1.32
--- src/sys/miscfs/genfs/genfs_io.c:1.31	Thu Jan 28 13:43:53 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Thu Jan 28 14:25:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.31 2010/01/28 13:43:53 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.32 2010/01/28 14:25:17 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.31 2010/01/28 13:43:53 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.32 2010/01/28 14:25:17 uebayasi Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -111,6 +111,8 @@
 	struct vnode * const vp = ap->a_vp;
 	struct genfs_node * const gp = VTOG(vp);
 	struct uvm_object * const uobj = &vp->v_uobj;
+	struct vm_page **pgs, *pgs_onstack[UBC_MAX_PAGES];
+	int pgs_size;
 	kauth_cred_t const cred = curlwp->l_cred;		/* XXXUBC curlwp */
 	const bool async = (flags & PGO_SYNCIO) == 0;
 	const bool write = (ap->a_access_type & VM_PROT_WRITE) != 0;
@@ -125,6 +127,9 @@
 	KASSERT(vp->v_type == VREG || vp->v_type == VDIR ||
 	    vp->v_type == VLNK || vp->v_type == VBLK);
 
+	pgs = NULL;
+	pgs_size = 0;
+
 startover:
 	error = 0;
 	const voff_t origvsize = vp->v_size;
@@ -262,16 +267,15 @@
 	    round_page(memeof));
 	const int ridx = (origoffset - startoffset) >> PAGE_SHIFT;
 
-	const int pgs_size = sizeof(struct vm_page *) *
+	pgs_size = sizeof(struct vm_page *) *
 	    ((endoffset - startoffset) >> PAGE_SHIFT);
-	struct vm_page **pgs, *pgs_onstack[UBC_MAX_PAGES];
 
 	if (pgs_size > sizeof(pgs_onstack)) {
 		pgs = kmem_zalloc(pgs_size, async ? KM_NOSLEEP : KM_SLEEP);
 		if (pgs == NULL) {
 			pgs = pgs_onstack;
 			error = ENOMEM;
-			goto out_err1;
+			goto out_err;
 		}
 	} else {
 		pgs = pgs_onstack;
@@ -312,7 +316,7 @@
 		genfs_rel_pages(&pgs[ridx], orignmempages);
 		mutex_exit(&uobj->vmobjlock);
 		error = EBUSY;
-		goto out_err1;
+		goto out_err;
 	}
 
 	/*
@@ -386,7 +390,7 @@
 			genfs_rel_pages(pgs, npages);
 			mutex_exit(&uobj->vmobjlock);
 			error = EBUSY;
-			goto out_err1;
+			goto out_err;
 		}
 	}
 	mutex_exit(&uobj->vmobjlock);
@@ -571,7 +575,7 @@
 		UVMHIST_LOG(ubchist, "returning 0 (async)",0,0,0,0);
 		genfs_node_unlock(vp);
 		error = 0;
-		goto out_err1;
+		goto out_err;
 	}
 	if (bp != NULL) {
 		error = biowait(mbp);
@@ -651,7 +655,7 @@
 		mutex_exit(&uvm_pageqlock);
 		mutex_exit(&uobj->vmobjlock);
 		UVMHIST_LOG(ubchist, "returning error %d", error,0,0,0);
-		goto out_err1;
+		goto out_err;
 	}
     }
 
@@ -697,10 +701,9 @@
 		    orignmempages * sizeof(struct vm_page *));
 	}
 
-out_err1:
+out_err:
 	if (pgs != NULL && pgs != pgs_onstack)
 		kmem_free(pgs, pgs_size);
-out_err:
 	if (has_trans)
 		fstrans_done(vp->v_mount);
 	return (error);

Reply via email to