summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrigoriy Orlov <gluk@cvs.openbsd.org>2001-04-22 21:33:47 +0000
committerGrigoriy Orlov <gluk@cvs.openbsd.org>2001-04-22 21:33:47 +0000
commit17ca96bd7a4844ec25ddf4038f6fdbda8560831a (patch)
tree13cbf3d4216263e98c763cad9a2bd2350d983beb
parent1692fa75790f396f9ae7bb4438a14c0cfb2efc16 (diff)
Free fs->fs_contigdirs array only on successful rw->ro update. This
fixes "duplicated free" panic. Update file system from read-write to read-only freed memory but may fail later if file system busy. deraadt@ ok.
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 88fcc43e0fd..ff73d0590a4 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ffs_vfsops.c,v 1.40 2001/04/19 16:22:17 gluk Exp $ */
+/* $OpenBSD: ffs_vfsops.c,v 1.41 2001/04/22 21:33:46 gluk Exp $ */
/* $NetBSD: ffs_vfsops.c,v 1.19 1996/02/09 22:22:26 christos Exp $ */
/*
@@ -194,7 +194,6 @@ ffs_mount(mp, path, data, ndp, p)
mp->mnt_flag &= ~MNT_SOFTDEP;
} else
error = ffs_flushfiles(mp, flags, p);
- free(fs->fs_contigdirs, M_WAITOK);
ronly = 1;
}
@@ -408,6 +407,8 @@ success:
fs->fs_ronly = ronly;
fs->fs_clean = ronly &&
(fs->fs_flags & FS_UNCLEAN) == 0 ? 1 : 0;
+ if (ronly)
+ free(fs->fs_contigdirs, M_WAITOK);
}
if (!ronly) {
if (mp->mnt_flag & MNT_SOFTDEP)
@@ -489,6 +490,7 @@ ffs_reload(mountp, cred, p)
*/
newfs->fs_csp = fs->fs_csp;
newfs->fs_maxcluster = fs->fs_maxcluster;
+ newfs->fs_ronly = fs->fs_ronly;
bcopy(newfs, fs, (u_int)fs->fs_sbsize);
if (fs->fs_sbsize < SBSIZE)
bp->b_flags |= B_INVAL;