fs: fat: treat invalid FAT clusters as errors

When hitting an invalid FAT cluster while reading a file always print an
error message and return an error code.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
Heinrich Schuchardt 2019-09-12 19:19:29 +02:00 committed by Tom Rini
parent ee8da596eb
commit c7a86d1645

View file

@ -301,10 +301,20 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
return 0; return 0;
} }
/* /**
* get_contents() - read from file
*
* Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr' * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr'
* into 'buffer'. * into 'buffer'. Update the number of bytes read in *gotsize or return -1 on
* Update the number of bytes read in *gotsize or return -1 on fatal errors. * fatal errors.
*
* @mydata: file system description
* @dentprt: directory entry pointer
* @pos: position from where to read
* @buffer: buffer into which to read
* @maxsize: maximum number of bytes to read
* @gotsize: number of bytes actually read
* Return: -1 on error, otherwise 0
*/ */
static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos, static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
__u8 *buffer, loff_t maxsize, loff_t *gotsize) __u8 *buffer, loff_t maxsize, loff_t *gotsize)
@ -335,8 +345,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
curclust = get_fatent(mydata, curclust); curclust = get_fatent(mydata, curclust);
if (CHECK_CLUST(curclust, mydata->fatsize)) { if (CHECK_CLUST(curclust, mydata->fatsize)) {
debug("curclust: 0x%x\n", curclust); debug("curclust: 0x%x\n", curclust);
debug("Invalid FAT entry\n"); printf("Invalid FAT entry\n");
return 0; return -1;
} }
actsize += bytesperclust; actsize += bytesperclust;
} }
@ -374,8 +384,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
curclust = get_fatent(mydata, curclust); curclust = get_fatent(mydata, curclust);
if (CHECK_CLUST(curclust, mydata->fatsize)) { if (CHECK_CLUST(curclust, mydata->fatsize)) {
debug("curclust: 0x%x\n", curclust); debug("curclust: 0x%x\n", curclust);
debug("Invalid FAT entry\n"); printf("Invalid FAT entry\n");
return 0; return -1;
} }
} }
@ -390,8 +400,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
goto getit; goto getit;
if (CHECK_CLUST(newclust, mydata->fatsize)) { if (CHECK_CLUST(newclust, mydata->fatsize)) {
debug("curclust: 0x%x\n", newclust); debug("curclust: 0x%x\n", newclust);
debug("Invalid FAT entry\n"); printf("Invalid FAT entry\n");
return 0; return -1;
} }
endclust = newclust; endclust = newclust;
actsize += bytesperclust; actsize += bytesperclust;
@ -418,7 +428,7 @@ getit:
if (CHECK_CLUST(curclust, mydata->fatsize)) { if (CHECK_CLUST(curclust, mydata->fatsize)) {
debug("curclust: 0x%x\n", curclust); debug("curclust: 0x%x\n", curclust);
printf("Invalid FAT entry\n"); printf("Invalid FAT entry\n");
return 0; return -1;
} }
actsize = bytesperclust; actsize = bytesperclust;
endclust = curclust; endclust = curclust;