]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/xfs/xfs_ioctl.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux.git] / fs / xfs / xfs_ioctl.c
index 7b35d62ede9faa7ff457bfa08a0683876fbd63db..d42de92cb28331dba52284daa23cb04ca06874de 100644 (file)
@@ -357,6 +357,7 @@ xfs_attrmulti_attr_get(
 {
        unsigned char           *kbuf;
        int                     error = -EFAULT;
+       size_t                  namelen;
 
        if (*len > XFS_XATTR_SIZE_MAX)
                return -EINVAL;
@@ -364,7 +365,9 @@ xfs_attrmulti_attr_get(
        if (!kbuf)
                return -ENOMEM;
 
-       error = xfs_attr_get(XFS_I(inode), name, &kbuf, (int *)len, flags);
+       namelen = strlen(name);
+       error = xfs_attr_get(XFS_I(inode), name, namelen, &kbuf, (int *)len,
+                            flags);
        if (error)
                goto out_kfree;
 
@@ -386,6 +389,7 @@ xfs_attrmulti_attr_set(
 {
        unsigned char           *kbuf;
        int                     error;
+       size_t                  namelen;
 
        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                return -EPERM;
@@ -396,7 +400,8 @@ xfs_attrmulti_attr_set(
        if (IS_ERR(kbuf))
                return PTR_ERR(kbuf);
 
-       error = xfs_attr_set(XFS_I(inode), name, kbuf, len, flags);
+       namelen = strlen(name);
+       error = xfs_attr_set(XFS_I(inode), name, namelen, kbuf, len, flags);
        if (!error)
                xfs_forget_acl(inode, name, flags);
        kfree(kbuf);
@@ -410,10 +415,12 @@ xfs_attrmulti_attr_remove(
        uint32_t                flags)
 {
        int                     error;
+       size_t                  namelen;
 
        if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                return -EPERM;
-       error = xfs_attr_remove(XFS_I(inode), name, flags);
+       namelen = strlen(name);
+       error = xfs_attr_remove(XFS_I(inode), name, namelen, flags);
        if (!error)
                xfs_forget_acl(inode, name, flags);
        return error;
@@ -462,6 +469,13 @@ xfs_attrmulti_by_handle(
 
        error = 0;
        for (i = 0; i < am_hreq.opcount; i++) {
+               if ((ops[i].am_flags & ATTR_ROOT) &&
+                   (ops[i].am_flags & ATTR_SECURE)) {
+                       ops[i].am_error = -EINVAL;
+                       continue;
+               }
+               ops[i].am_flags &= ~ATTR_KERNEL_FLAGS;
+
                ops[i].am_error = strncpy_from_user((char *)attr_name,
                                ops[i].am_attrname, MAXNAMELEN);
                if (ops[i].am_error == 0 || ops[i].am_error == MAXNAMELEN)