Only check directory xattr on ENOENT
[zfs.git] / module / zfs / zpl_xattr.c
index dbe61df..eb2c00d 100644 (file)
@@ -225,6 +225,11 @@ zpl_xattr_get_dir(struct inode *ip, const char *name, void *value,
                goto out;
        }
 
+       if (size < i_size_read(xip)) {
+               error = -ERANGE;
+               goto out;
+       }
+
        error = zpl_read_common(xip, value, size, 0, UIO_SYSSPACE, 0, cr);
 out:
        if (xip)
@@ -263,9 +268,12 @@ zpl_xattr_get_sa(struct inode *ip, const char *name, void *value, size_t size)
        if (!size)
                return (nv_size);
 
-       memcpy(value, nv_value, MIN(size, nv_size));
+       if (size < nv_size)
+               return (-ERANGE);
+
+       memcpy(value, nv_value, nv_size);
 
-       return (MIN(size, nv_size));
+       return (nv_size);
 }
 
 static int
@@ -280,7 +288,7 @@ __zpl_xattr_get(struct inode *ip, const char *name, void *value, size_t size,
 
        if (zsb->z_use_sa && zp->z_is_sa) {
                error = zpl_xattr_get_sa(ip, name, value, size);
-               if (error >= 0)
+               if (error != -ENOENT)
                        goto out;
        }
 
@@ -674,4 +682,5 @@ xattr_handler_t *zpl_xattr_handlers[] = {
        &zpl_xattr_acl_access_handler,
        &zpl_xattr_acl_default_handler,
 #endif /* HAVE_POSIX_ACLS */
+       NULL
 };