X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzpl_xattr.c;h=eb2c00dfb86f54083005bf019cc7bc73649cc0b5;hb=389cf730cedd42dd1ef653e9358635c114e458d5;hp=51c81ed0c97d7003f2971aae979b75b6573c6ef2;hpb=166dd49de0272e6f179e5fd6a41eebb4880a1154;p=zfs.git diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c index 51c81ed..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); - return (MIN(size, nv_size)); + memcpy(value, nv_value, 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; } @@ -622,7 +630,7 @@ __zpl_xattr_security_init(struct inode *ip, const struct xattr *xattrs, break; } - return (error); + return (error); } int @@ -638,26 +646,25 @@ int zpl_xattr_security_init(struct inode *ip, struct inode *dip, const struct qstr *qstr) { - int error; - size_t len; - void *value; - char *name; - - error = zpl_security_inode_init_security(ip, dip, qstr, - &name, &value, &len); - if (error) { - if (error == -EOPNOTSUPP) - return 0; + int error; + size_t len; + void *value; + char *name; - return (error); - } + error = zpl_security_inode_init_security(ip, dip, qstr, + &name, &value, &len); + if (error) { + if (error == -EOPNOTSUPP) + return 0; + return (error); + } error = __zpl_xattr_security_set(ip, name, value, len, 0); - kfree(name); - kfree(value); + kfree(name); + kfree(value); - return (error); + return (error); } #endif /* HAVE_CALLBACK_SECURITY_INODE_INIT_SECURITY */ @@ -673,6 +680,7 @@ xattr_handler_t *zpl_xattr_handlers[] = { &zpl_xattr_user_handler, #ifdef HAVE_POSIX_ACLS &zpl_xattr_acl_access_handler, - &zpl_xattr_acl_default_handler, + &zpl_xattr_acl_default_handler, #endif /* HAVE_POSIX_ACLS */ + NULL };