From aab06b8a4d254e76cd22257459e855bb71930357 Mon Sep 17 00:00:00 2001 From: Bart Oldeman Date: Mon, 13 Jun 2011 16:27:34 +0000 Subject: [PATCH] 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 --- kernel/fattab.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/kernel/fattab.c b/kernel/fattab.c index 72be93f..7c41e9d 100644 --- a/kernel/fattab.c +++ b/kernel/fattab.c @@ -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;