X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzpl_xattr.c;h=eb2c00dfb86f54083005bf019cc7bc73649cc0b5;hb=dba1d705669cf0e33091622d0e950b9459b20e2e;hp=dbe61df98cf0daaeb5c499a429daf89810d96f50;hpb=96b91ef0d6b289037c4d54357901e4b694e08f02;p=zfs.git diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c index dbe61df..eb2c00d 100644 --- a/module/zfs/zpl_xattr.c +++ b/module/zfs/zpl_xattr.c @@ -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 };