aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-09-04 08:06:55 -0400
committerJan Kara <jack@suse.cz>2014-09-04 08:12:29 -0400
commitc03aa9f6e1f938618e6db2e23afef0574efeeb65 (patch)
treeba1f7d3c1e99b262f43a1c2fa39aaf57701c664c /fs
parentbb7720a0b4a8ca3269fd86fbb45a78d2e0d3deaf (diff)
udf: Avoid infinite loop when processing indirect ICBs
We did not implement any bound on number of indirect ICBs we follow when loading inode. Thus corrupted medium could cause kernel to go into an infinite loop, possibly causing a stack overflow. Fix the possible stack overflow by removing recursion from __udf_read_inode() and limit number of indirect ICBs we follow to avoid infinite loops. Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r--fs/udf/inode.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 68cc7b144c26..a6a40536ebf1 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1270,6 +1270,13 @@ update_time:
1270 return 0; 1270 return 0;
1271} 1271}
1272 1272
1273/*
1274 * Maximum length of linked list formed by ICB hierarchy. The chosen number is
1275 * arbitrary - just that we hopefully don't limit any real use of rewritten
1276 * inode on write-once media but avoid looping for too long on corrupted media.
1277 */
1278#define UDF_MAX_ICB_NESTING 1024
1279
1273static void __udf_read_inode(struct inode *inode) 1280static void __udf_read_inode(struct inode *inode)
1274{ 1281{
1275 struct buffer_head *bh = NULL; 1282 struct buffer_head *bh = NULL;
@@ -1279,7 +1286,9 @@ static void __udf_read_inode(struct inode *inode)
1279 struct udf_inode_info *iinfo = UDF_I(inode); 1286 struct udf_inode_info *iinfo = UDF_I(inode);
1280 struct udf_sb_info *sbi = UDF_SB(inode->i_sb); 1287 struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
1281 unsigned int link_count; 1288 unsigned int link_count;
1289 unsigned int indirections = 0;
1282 1290
1291reread:
1283 /* 1292 /*
1284 * Set defaults, but the inode is still incomplete! 1293 * Set defaults, but the inode is still incomplete!
1285 * Note: get_new_inode() sets the following on a new inode: 1294 * Note: get_new_inode() sets the following on a new inode:
@@ -1317,28 +1326,26 @@ static void __udf_read_inode(struct inode *inode)
1317 ibh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 1, 1326 ibh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 1,
1318 &ident); 1327 &ident);
1319 if (ident == TAG_IDENT_IE && ibh) { 1328 if (ident == TAG_IDENT_IE && ibh) {
1320 struct buffer_head *nbh = NULL;
1321 struct kernel_lb_addr loc; 1329 struct kernel_lb_addr loc;
1322 struct indirectEntry *ie; 1330 struct indirectEntry *ie;
1323 1331
1324 ie = (struct indirectEntry *)ibh->b_data; 1332 ie = (struct indirectEntry *)ibh->b_data;
1325 loc = lelb_to_cpu(ie->indirectICB.extLocation); 1333 loc = lelb_to_cpu(ie->indirectICB.extLocation);
1326 1334
1327 if (ie->indirectICB.extLength && 1335 if (ie->indirectICB.extLength) {
1328 (nbh = udf_read_ptagged(inode->i_sb, &loc, 0, 1336 brelse(bh);
1329 &ident))) { 1337 brelse(ibh);
1330 if (ident == TAG_IDENT_FE || 1338 memcpy(&iinfo->i_location, &loc,
1331 ident == TAG_IDENT_EFE) { 1339 sizeof(struct kernel_lb_addr));
1332 memcpy(&iinfo->i_location, 1340 if (++indirections > UDF_MAX_ICB_NESTING) {
1333 &loc, 1341 udf_err(inode->i_sb,
1334 sizeof(struct kernel_lb_addr)); 1342 "too many ICBs in ICB hierarchy"
1335 brelse(bh); 1343 " (max %d supported)\n",
1336 brelse(ibh); 1344 UDF_MAX_ICB_NESTING);
1337 brelse(nbh); 1345 make_bad_inode(inode);
1338 __udf_read_inode(inode);
1339 return; 1346 return;
1340 } 1347 }
1341 brelse(nbh); 1348 goto reread;
1342 } 1349 }
1343 } 1350 }
1344 brelse(ibh); 1351 brelse(ibh);