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:
Bart Oldeman 2011-06-13 16:27:34 +00:00
parent aec735eecd
commit aab06b8a4d

View File

@ -92,14 +92,25 @@ void read_fsinfo(struct dpb FAR * dpbp)
{ {
struct buffer FAR *bp; struct buffer FAR *bp;
struct fsinfo FAR *fip; struct fsinfo FAR *fip;
CLUSTER cluster;
if (dpbp->dpb_xfsinfosec == 0xffff)
return;
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit); bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT | BFR_DIRTY); bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT | BFR_DIRTY);
bp->b_flag |= BFR_VALID; bp->b_flag |= BFR_VALID;
fip = (struct fsinfo FAR *)&bp->b_buffer[0x1e4]; fip = (struct fsinfo FAR *)&bp->b_buffer[0x1e4];
dpbp->dpb_xnfreeclst = fip->fi_nfreeclst; /* need to range check values because they may not be correct */
dpbp->dpb_xcluster = fip->fi_cluster; 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) void write_fsinfo(struct dpb FAR * dpbp)
@ -107,6 +118,9 @@ void write_fsinfo(struct dpb FAR * dpbp)
struct buffer FAR *bp; struct buffer FAR *bp;
struct fsinfo FAR *fip; struct fsinfo FAR *fip;
if (dpbp->dpb_xfsinfosec == 0xffff)
return;
bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit); bp = getblock(dpbp->dpb_xfsinfosec, dpbp->dpb_unit);
bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT); bp->b_flag &= ~(BFR_DATA | BFR_DIR | BFR_FAT);
bp->b_flag |= BFR_VALID; bp->b_flag |= BFR_VALID;