ocfs2: Check search result in ocfs2_xattr_block_get()
authorTiger Yang <tiger.yang@oracle.com>
Sun, 2 Nov 2008 11:04:21 +0000 (19:04 +0800)
committerMark Fasheh <mfasheh@suse.com>
Mon, 10 Nov 2008 17:51:47 +0000 (09:51 -0800)
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>
fs/ocfs2/xattr.c

index 70baffeb1812771620bf1a9d08f1e76d48927f68..054e2efb0b7e71f196025c777d61f2cc5954e0f9 100644 (file)
@@ -777,6 +777,11 @@ static int ocfs2_xattr_block_get(struct inode *inode,
                goto cleanup;
        }
 
+       if (xs->not_found) {
+               ret = -ENODATA;
+               goto cleanup;
+       }
+
        xb = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
        size = le64_to_cpu(xs->here->xe_value_size);
        if (buffer) {
@@ -860,7 +865,7 @@ static int ocfs2_xattr_get(struct inode *inode,
        down_read(&oi->ip_xattr_sem);
        ret = ocfs2_xattr_ibody_get(inode, name_index, name, buffer,
                                    buffer_size, &xis);
-       if (ret == -ENODATA)
+       if (ret == -ENODATA && di->i_xattr_loc)
                ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
                                            buffer_size, &xbs);
        up_read(&oi->ip_xattr_sem);