bin/53515: [PATCH] libufs/getino() calculates inode offset wrong
Lukas Ertl
l.ertl at univie.ac.at
Thu Jun 19 14:20:17 PDT 2003
>Number: 53515
>Category: bin
>Synopsis: [PATCH] libufs/getino() calculates inode offset wrong
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Jun 19 14:20:14 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Lukas Ertl
>Release: FreeBSD 5.1-CURRENT i386
>Organization:
Vienna University Computer Center
>Environment:
System: FreeBSD leelou 5.1-CURRENT FreeBSD 5.1-CURRENT #0: Mon Jun 16 13:00:21 CEST 2003 le at leelou:/usr/obj/usr/src/sys/LEELOU i386
>Description:
I just spent a couple of hours debugging an app that uses libufs/getino()
until I recognized that the bug was not in the app but in libufs.
The problem arises as soon as you're trying to get inode number 128 (UFS1)
or 64 (UFS2).
>How-To-Repeat:
Use getino() from libufs and try to get inode 128 from an UFS1 fs or inode 64
from an UFS2 fs.
>Fix:
I looked at the dump(8) sources which has a function getino() in
src/sbin/dump/traverse.c. getino() from libufs is almost a verbatim copy
of that function, but has a typo: '&' instead of '%'.
--- inode.c.diff begins here ---
Index: lib/libufs/inode.c
===================================================================
RCS file: /hugo/bsdcvs/src/lib/libufs/inode.c,v
retrieving revision 1.5
diff -u -r1.5 inode.c
--- lib/libufs/inode.c 9 Jun 2003 09:32:29 -0000 1.5
+++ lib/libufs/inode.c 19 Jun 2003 20:54:28 -0000
@@ -74,7 +74,7 @@
goto gotit;
bread(disk, fsbtodb(fs, ino_to_fsba(fs, inode)), inoblock,
fs->fs_bsize);
- disk->d_inomin = min = inode - (inode & INOPB(fs));
+ disk->d_inomin = min = inode - (inode % INOPB(fs));
disk->d_inomax = max = min + INOPB(fs);
gotit: switch (disk->d_ufs) {
case 1:
--- inode.c.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list