Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/ufs/lfs Fix catastrophic bug in lfs_rewind() that change...



details:   https://anonhg.NetBSD.org/src/rev/8d7de766e898
branches:  trunk
changeset: 339660:8d7de766e898
user:      dholland <dholland%NetBSD.org@localhost>
date:      Sun Aug 02 18:10:55 2015 +0000

description:
Fix catastrophic bug in lfs_rewind() that changed segment numbers
(lfs_curseg/lfs_nextseg in the superblock) using the wrong units.
These fields are for whatever reason the start addresses of segments
(measured in frags) rather than the segment numbers 0..n.

This only apparently affects dumping from a mounted fs; however, it
trashes the fs.

I would really, really like to have a static analysis tool that can
keep track of the units things are measured in, since fs code is full
of conversion macros and the macros are named inscrutable things like
"sntod" whose letters don't necessarily even correspond to the units
they convert. It is surprising that more of these are not wrong.

diffstat:

 sys/ufs/lfs/lfs_segment.c |  8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diffs (36 lines):

diff -r bffd3f803753 -r 8d7de766e898 sys/ufs/lfs/lfs_segment.c
--- a/sys/ufs/lfs/lfs_segment.c Sun Aug 02 18:10:07 2015 +0000
+++ b/sys/ufs/lfs/lfs_segment.c Sun Aug 02 18:10:55 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lfs_segment.c,v 1.246 2015/08/02 18:10:08 dholland Exp $       */
+/*     $NetBSD: lfs_segment.c,v 1.247 2015/08/02 18:10:55 dholland Exp $       */
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.246 2015/08/02 18:10:08 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.247 2015/08/02 18:10:55 dholland Exp $");
 
 #define _VFS_VNODE_PRIVATE     /* XXX: check for VI_MARKER, this has to go */
 
@@ -1699,7 +1699,7 @@
 }
 
 /*
- * Move lfs_offset to a segment earlier than sn.
+ * Move lfs_offset to a segment earlier than newsn.
  */
 int
 lfs_rewind(struct lfs *fs, int newsn)
@@ -1730,7 +1730,7 @@
                panic("lfs_rewind: no clean segments");
        if (newsn >= 0 && sn >= newsn)
                return ENOENT;
-       lfs_sb_setnextseg(fs, sn);
+       lfs_sb_setnextseg(fs, lfs_sntod(fs, sn));
        lfs_newseg(fs);
        lfs_sb_setoffset(fs, lfs_sb_getcurseg(fs));
 



Home | Main Index | Thread Index | Old Index