[Bug 271354] reachable directory with zero link count can cause fsck to deref NULL
Date: Wed, 10 May 2023 19:09:49 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=271354
Bug ID: 271354
Summary: reachable directory with zero link count can cause
fsck to deref NULL
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: bin
Assignee: bugs@FreeBSD.org
Reporter: rtm@lcs.mit.edu
Created attachment 242111
--> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=242111&action=edit
ffs image with reachable directory with zero link count causes fsck to deref
NULL
If a directory inode's link count is zero, then pass1.c's checkinode()
doesn't call cacheino() to enter it into inphash[]:
if (mode == IFDIR) {
if (DIP(dp, di_size) == 0) {
inoinfo(inumber)->ino_state = DCLEAR;
} else if (DIP(dp, di_nlink) <= 0) {
inoinfo(inumber)->ino_state = DZLINK;
} else {
inoinfo(inumber)->ino_state = DSTATE;
cacheino(dp, inumber);
Then in pass2check(), if the directory is reachable, the fall-through
path from DZLINK calls getinoinfo(), which returns NULL, causing
inp->i_parent to crash:
case DZLINK:
if (inoinfo(idesc->id_number)->ino_state == DFOUND)
inoinfo(dirp->d_ino)->ino_state = DFOUND;
/* FALLTHROUGH */
case DFOUND:
inp = getinoinfo(dirp->d_ino);
if (idesc->id_entryno > 2) {
if (inp->i_parent == 0) {
I've attached a file system image in which i-node 3 (/.snap) has a 0
link count, and which yields this fsck_ffs backtrace:
Program received signal SIGSEGV, Segmentation fault.
Address not mapped to object.
0x000000000021f412 in pass2check (idesc=0x7fffffffe7b8) at pass2.c:554
554 if (inp->i_parent == 0) {
(gdb) where
#0 0x000000000021f412 in pass2check (idesc=0x7fffffffe7b8) at pass2.c:554
#1 0x00000000002093e7 in dirscan (idesc=0x7fffffffe7b8) at dir.c:211
#2 0x000000000021318b in ckinode (dp=0x7fffffffe6b8, idesc=0x7fffffffe7b8)
at inode.c:126
#3 0x000000000021e130 in pass2 () at pass2.c:202
#4 0x0000000000219a7d in checkfilesys (filesys=0x7fffffffed71 "junk")
at main.c:468
#5 0x0000000000218f42 in main (argc=1, argv=0x7fffffffea20) at main.c:210
--
You are receiving this mail because:
You are the assignee for the bug.