misc/108215: bug in fsread in sys/boot/common/ufsread.c

Yuichiro Goto y7goto at gmail.com
Mon Jan 22 17:20:22 UTC 2007


>Number:         108215
>Category:       misc
>Synopsis:       bug in fsread in sys/boot/common/ufsread.c
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jan 22 17:20:22 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Yuichiro Goto
>Release:        FreeBSD 6.2-RELEASE i386
>Organization:
>Environment:
FreeBSD cobalt.my.domain 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Thu Jan 18 10:10:43 JST 2007     root at cobalt.my.domain:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
Incorrect calculation of a virtual block address within the single indirect block causes corruption of a large file.

>How-To-Repeat:
Read a large file.  On my system, a file that is larger than 16384 * (512 + 12) bytes on a filesystem (UFS2) with bsize = 16384 is corrupted.
>Fix:
See the attached diff.

Patch attached with submission follows:

Index: ufsread.c
===================================================================
RCS file: /home/ncvs/src/sys/boot/common/ufsread.c,v
retrieving revision 1.14
diff -u -r1.14 ufsread.c
--- ufsread.c	30 Jan 2005 14:58:00 -0000	1.14
+++ ufsread.c	22 Jan 2007 16:43:32 -0000
@@ -249,7 +249,7 @@
 		} else if (lbn < NDADDR + NINDIR(fs)) {
 			n = INDIRPERVBLK(fs);
 			addr = DIP(di_ib[0]);
-			u = (u_int)(lbn - NDADDR) / (n * DBPERVBLK);
+			u = (u_int)(lbn - NDADDR) / n * DBPERVBLK;
 			vbaddr = fsbtodb(fs, addr) + u;
 			if (indmap != vbaddr) {
 				if (dskread(indbuf, vbaddr, DBPERVBLK))

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list