Re: 868c1b8431f2 - main - fstyp: detect Raspberry Pi Pico boot filesystem as FAT

From: Ravi Pokala <rpokala_at_freebsd.org>
Date: Tue, 29 Mar 2022 23:05:21 UTC
"0x55 0xaa" at offset 510 is the signature for a (P)MBR partition table, not a FAT filesystem.

-Ravi (rpokala@)

-----Original Message-----
From: <owner-src-committers@freebsd.org> on behalf of Ed Maste <emaste@FreeBSD.org>
Date: 2022-03-29, Tuesday at 14:33
To: <src-committers@FreeBSD.org>, <dev-commits-src-all@FreeBSD.org>, <dev-commits-src-main@FreeBSD.org>
Subject: git: 868c1b8431f2 - main - fstyp: detect Raspberry Pi Pico boot filesystem as FAT

    The branch main has been updated by emaste:

    URL: https://cgit.FreeBSD.org/src/commit/?id=868c1b8431f297ade8deba5baf903f73cf5e11c6

    commit 868c1b8431f297ade8deba5baf903f73cf5e11c6
    Author:     Ed Maste <emaste@FreeBSD.org>
    AuthorDate: 2022-03-28 21:03:10 +0000
    Commit:     Ed Maste <emaste@FreeBSD.org>
    CommitDate: 2022-03-29 21:33:15 +0000

        fstyp: detect Raspberry Pi Pico boot filesystem as FAT

        fstyp looks for a 0x55 0xAA signature at offset 510, but this is not
        required by specifications and is not proivded by the Raspberry Pi Nano
        bootloader.

        We should really remove the signature check and implement a more
        comprehensive BPB validation instead, but it will require more
        investigation and testing.  For now just add a special case for the
        Raspberry Pi Nano bootloader, to avoid introducing regressions or new
        false positives.

        PR:             262896
        Reviewed by:    delphij
        MFC after:      3 days
        Sponsored by:   The FreeBSD Foundation
        Differential Revision:  https://reviews.freebsd.org/D34699
    ---
     usr.sbin/fstyp/msdosfs.c | 21 +++++++++++++++++++--
     1 file changed, 19 insertions(+), 2 deletions(-)

    diff --git a/usr.sbin/fstyp/msdosfs.c b/usr.sbin/fstyp/msdosfs.c
    index 47d2383fbc8f..b2144fa46cb1 100644
    --- a/usr.sbin/fstyp/msdosfs.c
    +++ b/usr.sbin/fstyp/msdosfs.c
    @@ -41,6 +41,24 @@ __FBSDID("$FreeBSD$");

     #define LABEL_NO_NAME		"NO NAME    "

    +/*
    + * XXX the signature 0x55 0xAA as the last two bytes of 512 is not required
    + * by specifications, but was historically required by fstyp.  This check
    + * should be removed, with a more comprehensive BPB validation instead.
    + */
    +static bool
    +check_signature(uint8_t sector0[512])
    +{
    +	/* Check for the FAT boot sector signature. */
    +	if (sector0[510] == 0x55 && sector0[511] == 0xaa)
    +		return (true);
    +	/* Special case for Raspberry Pi Nano bootloader. */
    +	if (sector0[510] == 0 && sector0[511] == 0 &&
    +	    sector0[0] == 0xeb && sector0[1] == 0x3c && sector0[2] == 0x90)
    +		return (true);
    +	return (false);
    +}
    +
     int
     fstyp_msdosfs(FILE *fp, char *label, size_t size)
     {
    @@ -58,8 +76,7 @@ fstyp_msdosfs(FILE *fp, char *label, size_t size)
     	if (sector0 == NULL)
     		return (1);

    -	/* Check for the FAT boot sector signature. */
    -	if (sector0[510] != 0x55 || sector0[511] != 0xaa) {
    +	if (!check_signature(sector0)) {
     		goto error;
     	}