fsck_msdos misdetects corruption

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

fsck_msdos misdetects corruption

Nick Guenther
>Submitter-Id: kousu
>Originator: Nick Guenther
>Organization:
>Synopsis: fsck_msdos detects a bad partition when it's actually okay
>Severity: non-critical
>Priority: medium
>Catergory: system
>Class: sw-bug
>Release: 3.8-Release
>Environment:
        System : OpenBSD 3.8
        Architecture : OpenBSD.i386
        Machine: : i386
>Description:
        Runng fsck_msdos on FAT32 partitions that have been corrupted in a
certain way causes "backup doesn't compare to primary bootblock" even
when the corresponding microsoft tools say the disk is clean. This is
because it compares too much of the primary and backup bootblocks on a
FAT32 partition. It should only compare the first 52 bytes but it
compares the entirety of the DOS boot block.
>How-To-Repeat:
        Format a new FAT32 partition (ideally using microsoft tools). If you
run fsck_msdos on this it is fine because the primary and backup
bootblocks were both initialized the same way (presumable to nulls).
However, if you corrupt one of them (pulling the power while it's
running will do this) and then try fsck_msdos you see "backup doesn't
compare to primary bootblock"; this occurs even if you run scandisk
(from windows) on the partition before trying fsck_msdos because
scandisk will only fix the first 52 bytes and ignores the rest of the
boot block.
>Fix:
        The fix for this was actually provided years ago, but appearantly was
forgotten, so I'm reminding you. See
http://www.monkey.org/openbsd/archive/bugs/0105/msg00085.html for the
fix. Basically, just go into /usr/src/sbin/fsck_msdos/boot.c and
change
if(memcmp(block, backup, DOSBOOTBLOCKSIZE ))
to
if(memcmp(block, backup, 52))
There's something else in that message too that I don't understand but
is probably worth looking at.

Reply | Threaded
Open this post in threaded view
|

Re: fsck_msdos misdetects corruption

Ted Unangst-2
> fix. Basically, just go into /usr/src /sbin/fsck_msdos/boot.c and
> change
> if(memcmp(block, backup, DOSBOOTBLOCKSIZE ))
> to
> if(memcmp(block, backup, 52))

looking at netbsd, they changed it to
+ backup[65] = block[65]; /* XXX */
+ if (memcmp(block + 11, backup + 11, 79)) {

which is entirely different.