@@ -87,7 +87,7 @@ static int dbAllocCtl(struct bmap * bmp, s64 nblocks, int l2nb, s64 blkno,
8787static int dbExtend (struct inode * ip , s64 blkno , s64 nblocks , s64 addnblocks );
8888static int dbFindBits (u32 word , int l2nb );
8989static int dbFindCtl (struct bmap * bmp , int l2nb , int level , s64 * blkno );
90- static int dbFindLeaf (dmtree_t * tp , int l2nb , int * leafidx );
90+ static int dbFindLeaf (dmtree_t * tp , int l2nb , int * leafidx , bool is_ctl );
9191static int dbFreeBits (struct bmap * bmp , struct dmap * dp , s64 blkno ,
9292 int nblocks );
9393static int dbFreeDmap (struct bmap * bmp , struct dmap * dp , s64 blkno ,
@@ -180,7 +180,8 @@ int dbMount(struct inode *ipbmap)
180180 bmp -> db_nfree = le64_to_cpu (dbmp_le -> dn_nfree );
181181
182182 bmp -> db_l2nbperpage = le32_to_cpu (dbmp_le -> dn_l2nbperpage );
183- if (bmp -> db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE ) {
183+ if (bmp -> db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE ||
184+ bmp -> db_l2nbperpage < 0 ) {
184185 err = - EINVAL ;
185186 goto err_release_metapage ;
186187 }
@@ -194,6 +195,12 @@ int dbMount(struct inode *ipbmap)
194195 bmp -> db_maxlevel = le32_to_cpu (dbmp_le -> dn_maxlevel );
195196 bmp -> db_maxag = le32_to_cpu (dbmp_le -> dn_maxag );
196197 bmp -> db_agpref = le32_to_cpu (dbmp_le -> dn_agpref );
198+ if (bmp -> db_maxag >= MAXAG || bmp -> db_maxag < 0 ||
199+ bmp -> db_agpref >= MAXAG || bmp -> db_agpref < 0 ) {
200+ err = - EINVAL ;
201+ goto err_release_metapage ;
202+ }
203+
197204 bmp -> db_aglevel = le32_to_cpu (dbmp_le -> dn_aglevel );
198205 bmp -> db_agheight = le32_to_cpu (dbmp_le -> dn_agheight );
199206 bmp -> db_agwidth = le32_to_cpu (dbmp_le -> dn_agwidth );
@@ -1710,7 +1717,7 @@ static int dbFindCtl(struct bmap * bmp, int l2nb, int level, s64 * blkno)
17101717 * dbFindLeaf() returns the index of the leaf at which
17111718 * free space was found.
17121719 */
1713- rc = dbFindLeaf ((dmtree_t * ) dcp , l2nb , & leafidx );
1720+ rc = dbFindLeaf ((dmtree_t * ) dcp , l2nb , & leafidx , true );
17141721
17151722 /* release the buffer.
17161723 */
@@ -1957,7 +1964,7 @@ dbAllocDmapLev(struct bmap * bmp,
19571964 * free space. if sufficient free space is found, dbFindLeaf()
19581965 * returns the index of the leaf at which free space was found.
19591966 */
1960- if (dbFindLeaf ((dmtree_t * ) & dp -> tree , l2nb , & leafidx ))
1967+ if (dbFindLeaf ((dmtree_t * ) & dp -> tree , l2nb , & leafidx , false ))
19611968 return - ENOSPC ;
19621969
19631970 if (leafidx < 0 )
@@ -2921,14 +2928,18 @@ static void dbAdjTree(dmtree_t * tp, int leafno, int newval)
29212928 * leafidx - return pointer to be set to the index of the leaf
29222929 * describing at least l2nb free blocks if sufficient
29232930 * free blocks are found.
2931+ * is_ctl - determines if the tree is of type ctl
29242932 *
29252933 * RETURN VALUES:
29262934 * 0 - success
29272935 * -ENOSPC - insufficient free blocks.
29282936 */
2929- static int dbFindLeaf (dmtree_t * tp , int l2nb , int * leafidx )
2937+ static int dbFindLeaf (dmtree_t * tp , int l2nb , int * leafidx , bool is_ctl )
29302938{
29312939 int ti , n = 0 , k , x = 0 ;
2940+ int max_size ;
2941+
2942+ max_size = is_ctl ? CTLTREESIZE : TREESIZE ;
29322943
29332944 /* first check the root of the tree to see if there is
29342945 * sufficient free space.
@@ -2949,6 +2960,8 @@ static int dbFindLeaf(dmtree_t * tp, int l2nb, int *leafidx)
29492960 /* sufficient free space found. move to the next
29502961 * level (or quit if this is the last level).
29512962 */
2963+ if (x + n > max_size )
2964+ return - ENOSPC ;
29522965 if (l2nb <= tp -> dmt_stree [x + n ])
29532966 break ;
29542967 }
0 commit comments