mirror of
https://github.com/FDOS/kernel.git
synced 2025-07-27 15:54:06 +02:00
Do not use FSINFO structure if it is not present.
Do some range checks on FSINFO values to make sure they are valid. Fixes issue reported by dos386 on the mailing list. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1631 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
aec735eecd
commit
aab06b8a4d
@ -92,14 +92,25 @@ void read_fsinfo(struct dpb FAR * dpbp)
|
||||
{
|
||||
struct buffer FAR *bp;
|
||||
struct fsinfo FAR *fip;
|
||||
CLUSTER cluster;
|
||||
|
||||
if (dpbp->dpb_xfsinfosec == 0xffff)
|
||||
return;
|
||||
|
||||
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
|
||||
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT | BFR_DIRTY);
|
||||
bp->b_flag |= BFR_VALID;
|
||||
|
||||
fip = (struct fsinfo FAR *)&bp->b_buffer[0x1e4];
|
||||
dpbp->dpb_xnfreeclst = fip->fi_nfreeclst;
|
||||
dpbp->dpb_xcluster = fip->fi_cluster;
|
||||
/* need to range check values because they may not be correct */
|
||||
cluster = fip->fi_nfreeclst;
|
||||
if (cluster >= dpbp->dpb_xsize)
|
||||
cluster = XUNKNCLSTFREE;
|
||||
dpbp->dpb_xnfreeclst = cluster;
|
||||
cluster = fip->fi_cluster;
|
||||
if (cluster < 2 || cluster > dpbp->dpb_xsize)
|
||||
cluster = UNKNCLUSTER;
|
||||
dpbp->dpb_xcluster = cluster;
|
||||
}
|
||||
|
||||
void write_fsinfo(struct dpb FAR * dpbp)
|
||||
@ -107,6 +118,9 @@ void write_fsinfo(struct dpb FAR * dpbp)
|
||||
struct buffer FAR *bp;
|
||||
struct fsinfo FAR *fip;
|
||||
|
||||
if (dpbp->dpb_xfsinfosec == 0xffff)
|
||||
return;
|
||||
|
||||
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
|
||||
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT);
|
||||
bp->b_flag |= BFR_VALID;
|
||||
|
Loading…
x
Reference in New Issue
Block a user