Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/miscfs/genfs Revert part which variable initializations ...
details: https://anonhg.NetBSD.org/src/rev/9fff8dbdf628
branches: trunk
changeset: 751222:9fff8dbdf628
user: uebayasi <uebayasi%NetBSD.org@localhost>
date: Thu Jan 28 14:25:17 2010 +0000
description:
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;".
diffstat:
sys/miscfs/genfs/genfs_io.c | 25 ++++++++++++++-----------
1 files changed, 14 insertions(+), 11 deletions(-)
diffs (104 lines):
diff -r 9c8a392b2d6e -r 9fff8dbdf628 sys/miscfs/genfs/genfs_io.c
--- a/sys/miscfs/genfs/genfs_io.c Thu Jan 28 14:12:11 2010 +0000
+++ b/sys/miscfs/genfs/genfs_io.c Thu Jan 28 14:25:17 2010 +0000
@@ -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);
Home |
Main Index |
Thread Index |
Old Index