summaryrefslogtreecommitdiffstats
path: root/sys/nfs
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2001-08-01 10:25:13 +0000
committeriedowse <iedowse@FreeBSD.org>2001-08-01 10:25:13 +0000
commita39dd4a8a2667a356076c964a98d206994042433 (patch)
treec6b4cfdde3833cc33b877f898f5192102f43b2a8 /sys/nfs
parent783238c99fb9b94143ab761ea6b702787b57a7a0 (diff)
downloadFreeBSD-src-a39dd4a8a2667a356076c964a98d206994042433.zip
FreeBSD-src-a39dd4a8a2667a356076c964a98d206994042433.tar.gz
Fix a client-side memory leak in nfs_flush(). The code allocates
a temporary array to store struct buf pointers if the list doesn't fit in a local array. Usually it frees the array when finished, but if it jumps to the 'again' label and the new list does fit in the local array then it can forget to free a previously malloc'd M_TEMP memory. Move the free() up a line so that it frees any previously allocated memory whether or not it needs to malloc a new array. Reviewed by: dillon
Diffstat (limited to 'sys/nfs')
-rw-r--r--sys/nfs/nfs_vnops.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index d37615a..5b84741 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -2802,9 +2802,9 @@ again:
* If we can't get memory (for whatever reason), we will end up
* committing the buffers one-by-one in the loop below.
*/
+ if (bvec != NULL && bvec != bvec_on_stack)
+ free(bvec, M_TEMP);
if (bveccount > NFS_COMMITBVECSIZ) {
- if (bvec != NULL && bvec != bvec_on_stack)
- free(bvec, M_TEMP);
bvec = (struct buf **)
malloc(bveccount * sizeof(struct buf *),
M_TEMP, M_NOWAIT);
OpenPOWER on IntegriCloud