hc
2024-05-10 ee930fffee469d076998274a2ca55e13dc1efb67
kernel/fs/jfs/jfs_dmap.c
....@@ -155,7 +155,7 @@
155155 struct bmap *bmp;
156156 struct dbmap_disk *dbmp_le;
157157 struct metapage *mp;
158
- int i;
158
+ int i, err;
159159
160160 /*
161161 * allocate/initialize the in-memory bmap descriptor
....@@ -170,20 +170,25 @@
170170 BMAPBLKNO << JFS_SBI(ipbmap->i_sb)->l2nbperpage,
171171 PSIZE, 0);
172172 if (mp == NULL) {
173
- kfree(bmp);
174
- return -EIO;
173
+ err = -EIO;
174
+ goto err_kfree_bmp;
175175 }
176176
177177 /* copy the on-disk bmap descriptor to its in-memory version. */
178178 dbmp_le = (struct dbmap_disk *) mp->data;
179179 bmp->db_mapsize = le64_to_cpu(dbmp_le->dn_mapsize);
180180 bmp->db_nfree = le64_to_cpu(dbmp_le->dn_nfree);
181
+
181182 bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage);
183
+ if (bmp->db_l2nbperpage > L2PSIZE - L2MINBLOCKSIZE) {
184
+ err = -EINVAL;
185
+ goto err_release_metapage;
186
+ }
187
+
182188 bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag);
183189 if (!bmp->db_numag) {
184
- release_metapage(mp);
185
- kfree(bmp);
186
- return -EINVAL;
190
+ err = -EINVAL;
191
+ goto err_release_metapage;
187192 }
188193
189194 bmp->db_maxlevel = le32_to_cpu(dbmp_le->dn_maxlevel);
....@@ -194,6 +199,17 @@
194199 bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth);
195200 bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart);
196201 bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size);
202
+ if (bmp->db_agl2size > L2MAXL2SIZE - L2MAXAG ||
203
+ bmp->db_agl2size < 0) {
204
+ err = -EINVAL;
205
+ goto err_release_metapage;
206
+ }
207
+
208
+ if (((bmp->db_mapsize - 1) >> bmp->db_agl2size) > MAXAG) {
209
+ err = -EINVAL;
210
+ goto err_release_metapage;
211
+ }
212
+
197213 for (i = 0; i < MAXAG; i++)
198214 bmp->db_agfree[i] = le64_to_cpu(dbmp_le->dn_agfree[i]);
199215 bmp->db_agsize = le64_to_cpu(dbmp_le->dn_agsize);
....@@ -214,6 +230,12 @@
214230 BMAP_LOCK_INIT(bmp);
215231
216232 return (0);
233
+
234
+err_release_metapage:
235
+ release_metapage(mp);
236
+err_kfree_bmp:
237
+ kfree(bmp);
238
+ return err;
217239 }
218240
219241
....@@ -247,6 +269,7 @@
247269
248270 /* free the memory for the in-memory bmap. */
249271 kfree(bmp);
272
+ JFS_SBI(ipbmap->i_sb)->bmap = NULL;
250273
251274 return (0);
252275 }
....@@ -2005,6 +2028,9 @@
20052028 if (dbFindLeaf((dmtree_t *) & dp->tree, l2nb, &leafidx))
20062029 return -ENOSPC;
20072030
2031
+ if (leafidx < 0)
2032
+ return -EIO;
2033
+
20082034 /* determine the block number within the file system corresponding
20092035 * to the leaf at which free space was found.
20102036 */