ocfs2: Check search result in ocfs2_xattr_block_get()
ocfs2_xattr_block_get() calls ocfs2_xattr_search() to find an external xattr, but doesn't check the search result that is passed back via struct ocfs2_xattr_search. Add a check for search result, and pass back -ENODATA if the xattr search failed. This avoids a later NULL pointer error. Signed-off-by: Tiger Yang <tiger.yang@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
de29c08528
commit
6c1e183e12
@ -777,6 +777,11 @@ static int ocfs2_xattr_block_get(struct inode *inode,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xs->not_found) {
|
||||||
|
ret = -ENODATA;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
xb = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
|
xb = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
|
||||||
size = le64_to_cpu(xs->here->xe_value_size);
|
size = le64_to_cpu(xs->here->xe_value_size);
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
@ -860,7 +865,7 @@ static int ocfs2_xattr_get(struct inode *inode,
|
|||||||
down_read(&oi->ip_xattr_sem);
|
down_read(&oi->ip_xattr_sem);
|
||||||
ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
|
ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
|
||||||
buffer_size, &xis);
|
buffer_size, &xis);
|
||||||
if (ret == -ENODATA)
|
if (ret == -ENODATA && di->i_xattr_loc)
|
||||||
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
|
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
|
||||||
buffer_size, &xbs);
|
buffer_size, &xbs);
|
||||||
up_read(&oi->ip_xattr_sem);
|
up_read(&oi->ip_xattr_sem);
|
||||||
|
Loading…
Reference in New Issue
Block a user