diff options
| -rw-r--r-- | fs/squashfs/super.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index efa8118260d4..984d6c861928 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c | |||
| @@ -268,7 +268,7 @@ allocate_id_index_table: | |||
| 268 | handle_fragments: | 268 | handle_fragments: |
| 269 | fragments = le32_to_cpu(sblk->fragments); | 269 | fragments = le32_to_cpu(sblk->fragments); |
| 270 | if (fragments == 0) | 270 | if (fragments == 0) |
| 271 | goto allocate_root; | 271 | goto check_directory_table; |
| 272 | 272 | ||
| 273 | msblk->fragment_cache = squashfs_cache_init("fragment", | 273 | msblk->fragment_cache = squashfs_cache_init("fragment", |
| 274 | SQUASHFS_CACHED_FRAGMENTS, msblk->block_size); | 274 | SQUASHFS_CACHED_FRAGMENTS, msblk->block_size); |
| @@ -286,8 +286,22 @@ handle_fragments: | |||
| 286 | msblk->fragment_index = NULL; | 286 | msblk->fragment_index = NULL; |
| 287 | goto failed_mount; | 287 | goto failed_mount; |
| 288 | } | 288 | } |
| 289 | next_table = msblk->fragment_index[0]; | ||
| 289 | 290 | ||
| 290 | allocate_root: | 291 | check_directory_table: |
| 292 | /* Sanity check directory_table */ | ||
| 293 | if (msblk->directory_table >= next_table) { | ||
| 294 | err = -EINVAL; | ||
| 295 | goto failed_mount; | ||
| 296 | } | ||
| 297 | |||
| 298 | /* Sanity check inode_table */ | ||
| 299 | if (msblk->inode_table >= msblk->directory_table) { | ||
| 300 | err = -EINVAL; | ||
| 301 | goto failed_mount; | ||
| 302 | } | ||
| 303 | |||
| 304 | /* allocate root */ | ||
| 291 | root = new_inode(sb); | 305 | root = new_inode(sb); |
| 292 | if (!root) { | 306 | if (!root) { |
| 293 | err = -ENOMEM; | 307 | err = -ENOMEM; |
