[U-Boot] [PATCH v1] fat: fatwrite: fix the command for FAT12

Stefan Bruens stefan.bruens at rwth-aachen.de
Sun Dec 11 00:29:07 CET 2016


On Freitag, 9. Dezember 2016 13:55:37 CET Philipp Skadorov wrote:
> The u-boot command fatwrite empties FAT clusters from the beginning
> till the end of the file.
> Specifically for FAT12 it fails to detect the end of the file and goes
> beyond the file bounds thus corrupting the file system.
> 
> The users normally workaround this by re-formatting the partition as
> FAT16/FAT32, like here:
> https://github.com/FEDEVEL/openrex-uboot-v2015.10/issues/1
> 
> The patch is to check file bounds by already-existing macro that
> accounts for FAT12.
> The command then works correctly for all types of FAT.
> 
> Signed-off-by: Philipp Skadorov <philipp.skadorov at savoirfairelinux.com>
> Cc:Donggeun Kim <dg77.kim at samsung.com>
> ---
>  fs/fat/fat_write.c | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
> index 40a3860..e4f600e 100644
> --- a/fs/fat/fat_write.c
> +++ b/fs/fat/fat_write.c
> @@ -670,16 +670,13 @@ static int clear_fatent(fsdata *mydata, __u32 entry)
>  {
>  	__u32 fat_val;
> 
> -	while (1) {
> +	while (!CHECK_CLUST(entry, mydata->fatsize)) {
>  		fat_val = get_fatent_value(mydata, entry);
>  		if (fat_val != 0)
>  			set_fatent_value(mydata, entry, 0);
>  		else
>  			break;
> 
> -		if (fat_val == 0xfffffff || fat_val == 0xffff)
> -			break;
> -
>  		entry = fat_val;
>  	}

NAK.

This corrupts the file system, as set_fatent_value(...) has:

	switch (mydata->fatsize) {
	case 32:
		bufnum = entry / FAT32BUFSIZE;
		offset = entry - bufnum * FAT32BUFSIZE;
		break;
	case 16:
		bufnum = entry / FAT16BUFSIZE;
		offset = entry - bufnum * FAT16BUFSIZE;
		break;
	default:
		/* Unsupported FAT size */
		return -1;
	}

Kind regards,

Stefan

-- 
Stefan Brüns  /  Bergstraße 21  /  52062 Aachen
home: +49 241 53809034     mobile: +49 151 50412019
work: +49 2405 49936-424


More information about the U-Boot mailing list