summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohamad Ayyash <mkayyash@google.com>2016-04-29 18:18:24 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-04-29 18:18:24 +0000
commit2592d45099fecb384753d3fb9a3bc88a25c56296 (patch)
treebf8b3203bc1d5c3724690010783014d899e28032
parent5a32b99f6abd85c9b3d030baf1c7269233bc626e (diff)
parentd2ed02a94086e1221041bc59825add3d0a657e19 (diff)
downloadextras-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.c16
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;