Commit 981035b4 authored by Yingtai Xie's avatar Yingtai Xie Committed by Linus Torvalds

ocfs2: correctly check the return value of ocfs2_search_extent_list

ocfs2_search_extent_list may return -1, so we should check the return
value in ocfs2_split_and_insert, otherwise it may cause array index out of
bound.

And ocfs2_search_extent_list can only return value less than
el->l_next_free_rec, so check if it is equal or larger than
le16_to_cpu(el->l_next_free_rec) is meaningless.
Signed-off-by: default avatarYingtai Xie <xieyingtai@huawei.com>
Signed-off-by: default avatarJoseph Qi <joseph.qi@huawei.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c811f5f4
...@@ -4961,6 +4961,15 @@ static int ocfs2_split_and_insert(handle_t *handle, ...@@ -4961,6 +4961,15 @@ static int ocfs2_split_and_insert(handle_t *handle,
el = path_leaf_el(path); el = path_leaf_el(path);
split_index = ocfs2_search_extent_list(el, cpos); split_index = ocfs2_search_extent_list(el, cpos);
if (split_index == -1) {
ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci),
"Owner %llu has an extent at cpos %u "
"which can no longer be found.\n",
(unsigned long long)ocfs2_metadata_cache_owner(et->et_ci),
cpos);
ret = -EROFS;
goto out;
}
goto leftright; goto leftright;
} }
out: out:
...@@ -5135,7 +5144,7 @@ int ocfs2_change_extent_flag(handle_t *handle, ...@@ -5135,7 +5144,7 @@ int ocfs2_change_extent_flag(handle_t *handle,
el = path_leaf_el(left_path); el = path_leaf_el(left_path);
index = ocfs2_search_extent_list(el, cpos); index = ocfs2_search_extent_list(el, cpos);
if (index == -1 || index >= le16_to_cpu(el->l_next_free_rec)) { if (index == -1) {
ocfs2_error(sb, ocfs2_error(sb,
"Owner %llu has an extent at cpos %u which can no " "Owner %llu has an extent at cpos %u which can no "
"longer be found.\n", "longer be found.\n",
...@@ -5491,7 +5500,7 @@ int ocfs2_remove_extent(handle_t *handle, ...@@ -5491,7 +5500,7 @@ int ocfs2_remove_extent(handle_t *handle,
el = path_leaf_el(path); el = path_leaf_el(path);
index = ocfs2_search_extent_list(el, cpos); index = ocfs2_search_extent_list(el, cpos);
if (index == -1 || index >= le16_to_cpu(el->l_next_free_rec)) { if (index == -1) {
ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci), ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci),
"Owner %llu has an extent at cpos %u which can no " "Owner %llu has an extent at cpos %u which can no "
"longer be found.\n", "longer be found.\n",
...@@ -5557,7 +5566,7 @@ int ocfs2_remove_extent(handle_t *handle, ...@@ -5557,7 +5566,7 @@ int ocfs2_remove_extent(handle_t *handle,
el = path_leaf_el(path); el = path_leaf_el(path);
index = ocfs2_search_extent_list(el, cpos); index = ocfs2_search_extent_list(el, cpos);
if (index == -1 || index >= le16_to_cpu(el->l_next_free_rec)) { if (index == -1) {
ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci), ocfs2_error(ocfs2_metadata_cache_get_super(et->et_ci),
"Owner %llu: split at cpos %u lost record.", "Owner %llu: split at cpos %u lost record.",
(unsigned long long)ocfs2_metadata_cache_owner(et->et_ci), (unsigned long long)ocfs2_metadata_cache_owner(et->et_ci),
......
...@@ -98,7 +98,7 @@ static int __ocfs2_move_extent(handle_t *handle, ...@@ -98,7 +98,7 @@ static int __ocfs2_move_extent(handle_t *handle,
el = path_leaf_el(path); el = path_leaf_el(path);
index = ocfs2_search_extent_list(el, cpos); index = ocfs2_search_extent_list(el, cpos);
if (index == -1 || index >= le16_to_cpu(el->l_next_free_rec)) { if (index == -1) {
ocfs2_error(inode->i_sb, ocfs2_error(inode->i_sb,
"Inode %llu has an extent at cpos %u which can no " "Inode %llu has an extent at cpos %u which can no "
"longer be found.\n", "longer be found.\n",
......
...@@ -3109,7 +3109,7 @@ static int ocfs2_clear_ext_refcount(handle_t *handle, ...@@ -3109,7 +3109,7 @@ static int ocfs2_clear_ext_refcount(handle_t *handle,
el = path_leaf_el(path); el = path_leaf_el(path);
index = ocfs2_search_extent_list(el, cpos); index = ocfs2_search_extent_list(el, cpos);
if (index == -1 || index >= le16_to_cpu(el->l_next_free_rec)) { if (index == -1) {
ocfs2_error(sb, ocfs2_error(sb,
"Inode %llu has an extent at cpos %u which can no " "Inode %llu has an extent at cpos %u which can no "
"longer be found.\n", "longer be found.\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment