summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2013-04-17 13:07:36 -0700
committerBrian Behlendorf <[email protected]>2013-04-24 12:35:04 -0700
commitf706421173c571371afff5e2a2ee0784c5e3f95d (patch)
tree602b28cbe4bbcbbd04ddff812f20f113ee7b5eba
parent254255f735c4187f00df6d230b80cae508308f31 (diff)
Correctly return ERANGE in getxattr(2)
According to the getxattr(2) man page the ERANGE errno should be returned when the size of the value buffer is to small to hold the result. Prior to this patch the implementation would just truncate the value to size bytes. Signed-off-by: Brian Behlendorf <[email protected]> Closes #1408
-rw-r--r--module/zfs/zpl_xattr.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c
index c03764fc5..a7e38e6a2 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