NetBSD-Bugs archive

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

bin/44209: superblock check can fail erroneously in resize_ffs(8)



>Number:         44209
>Category:       bin
>Synopsis:       superblock check can fail erroneously in resize_ffs(8)
>Confidential:   no
>Severity:       non-critical
>Priority:       high
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Dec 09 00:05:00 +0000 2010
>Originator:     Jeff Rizzo <riz%NetBSD.org@localhost>
>Release:        NetBSD 5.99.41
>Organization:
        
>Environment:
        
        
System: NetBSD netbsd6 5.99.41 NetBSD 5.99.41 (GENERIC) #0: Sun Dec 5 19:35:40 
PST 2010 riz@netbsd6:/home/riz/obj/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:
        The superblock search code in resize_ffs(8) is looking
for the wrong things, and can falsely claim not to handle a particular
superblock.  Also, it's not ffsv2 format blocks it has trouble with,
but actually ffsv1.

This code in resize_ffs.c main() is the culprit:

        for (where = search[i = 0]; search[i] != -1; where = search[++i]) {
                readat(where / DEV_BSIZE, oldsb, SBLOCKSIZE);
                if (where == SBLOCK_UFS2 && (oldsb->fs_magic == FS_UFS1_MAGIC))
                        continue;
                if (oldsb->fs_magic == FS_UFS1_MAGIC)
                        break;
                if (oldsb->fs_old_flags & FS_FLAGS_UPDATED)
                        err(EXIT_FAILURE,
                            "Can't resize ffsv2 format superblock!");
        }

It is sometimes possible to hit the error condition on an otherwise-valid
file system.  The check should really be more like:

        if ((oldsb->fs_old_flags & FS_FLAGS_UPDATED) == 0)
                errx(EXIT_FAILURE, "Can't resize v1 format superblock!\n"
                    "Consider updating to a v2 superblock with "
                    "fsck_ffs -c 4.");

>How-To-Repeat:
        Try to resize a filesystem with just the wrong data.
>Fix:
        I have a fix in my local tree;  there are some more extensive changes
that will be made at the same time, so I'm holding off for a few days.


This PR is filed primarily because I will likely commit an expected-fail test
prior to fixing this PR.

>Unformatted:
        
        


Home | Main Index | Thread Index | Old Index