diff options
author | Mohamad Ayyash <mkayyash@google.com> | 2016-04-29 18:18:24 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-04-29 18:18:24 +0000 |
commit | 2592d45099fecb384753d3fb9a3bc88a25c56296 (patch) | |
tree | bf8b3203bc1d5c3724690010783014d899e28032 | |
parent | 5a32b99f6abd85c9b3d030baf1c7269233bc626e (diff) | |
parent | d2ed02a94086e1221041bc59825add3d0a657e19 (diff) | |
download | extras-2592d45099fecb384753d3fb9a3bc88a25c56296.tar.gz |
Incremental Ext4 Bug: prevent out of bound boundary allocations
am: d2ed02a940
* commit 'd2ed02a94086e1221041bc59825add3d0a657e19':
Incremental Ext4 Bug: prevent out of bound boundary allocations
Change-Id: I25c596b4db090b92ad475fb211e4b43a7dd2856b
-rw-r--r-- | ext4_utils/make_ext4fs.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/ext4_utils/make_ext4fs.c b/ext4_utils/make_ext4fs.c index 6083ceaa..f45a6990 100644 --- a/ext4_utils/make_ext4fs.c +++ b/ext4_utils/make_ext4fs.c @@ -617,10 +617,6 @@ static void extract_base_fs_allocations(const char *directory, const char *mount } else { end_block = parse_num(range); } - block_file_size = end_block - start_block + 1; - if (block_file_size > real_file_block_size) { - block_file_size = real_file_block_size; - } // Assummption is that allocations are within the same block group block_group = get_block_group(start_block); if (block_group != get_block_group(end_block)) { @@ -628,6 +624,18 @@ static void extract_base_fs_allocations(const char *directory, const char *mount "block group than start block. did you change fs params?"); } block_range = strtok_r(NULL, ",", &end_string); + int bg_first_block = bgs[block_group].first_block; + int min_bg_bound = bgs[block_group].chunks[0].block + bgs[block_group].chunks[0].len; + int max_bg_bound = bgs[block_group].chunks[bgs[block_group].chunk_count - 1].block; + + if (min_bg_bound >= start_block - bg_first_block || + max_bg_bound <= end_block - bg_first_block) { + continue; + } + block_file_size = end_block - start_block + 1; + if (block_file_size > real_file_block_size) { + block_file_size = real_file_block_size; + } append_region(fs_alloc, start_block, block_file_size, block_group); reserve_bg_chunk(block_group, start_block - bgs[block_group].first_block, block_file_size); real_file_block_size -= block_file_size; |