Skip to contentSkip to conversation

xattr: Fix error results for non-existent / invisible attributes

PATCH In review Andreas Gruenbacher 2 participants 3 messages May 27, 2011 – Jun 21, 2011 VFS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xattr: Fix error results for non-existent / invisible attributes

Return -ENODATA when trying to read a user.* attribute which cannot
exist: user space otherwise does not have a reasonable way to distinguish between non-existent and inaccessible attributes.

Likewise, return -ENODATA when an unprivileged process tries to read a trusted.* attribute: to unprivileged processes, those attributes are invisible (listxattr() won't include them).

Related to this bug report: https://bugzilla.redhat.com/660613

---
 fs/xattr.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)
fs/xattr.c +10 -6
index f1ef949..4be2e76 100644
@@ -46,18 +46,22 @@ xattr_permission(struct inode *inode, const char *name, int mask)
 		return 0;
 
 	/*
-	 * The trusted.* namespace can only be accessed by a privileged user.
+	 * The trusted.* namespace can only be accessed by privileged users.
 	 */
-	if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
-		return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM);
+	if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) {
+		if (!capable(CAP_SYS_ADMIN))
+			return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
+		return 0;
+	}
 
-	/* In user.* namespace, only regular files and directories can have
+	/*
+	 * In the user.* namespace, only regular files and directories can have
 	 * extended attributes. For sticky directories, only the owner and
-	 * privileged user can write attributes.
+	 * privileged users can write attributes.
 	 */
 	if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) {
 		if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
-			return -EPERM;
+			return (mask & MAY_WRITE) ? -EPERM : -ENODATA;
 		if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) &&
 		    (mask & MAY_WRITE) && !inode_owner_or_capable(inode))
 			return -EPERM;
Signature · 1 line
1.7.1
#1 lore raw
Quoted 7 lines · Andreas Gruenbacher

Return -ENODATA when trying to read a user.* attribute which cannot
exist: user space otherwise does not have a reasonable way to distinguish between non-existent and inaccessible attributes.

Likewise, return -ENODATA when an unprivileged process tries to read a trusted.* attribute: to unprivileged processes, those attributes are invisible (listxattr() won't include them).

This breaks xfstests 062. It would also be very useful to send VFS patches to linux-fsdevel, btw.

#2 lore raw
Quoted 10 lines · Christoph Hellwig
Quoted 7 lines · Andreas Gruenbacher

Return -ENODATA when trying to read a user.* attribute which cannot
exist: user space otherwise does not have a reasonable way to distinguish between non-existent and inaccessible attributes.

Likewise, return -ENODATA when an unprivileged process tries to read a trusted.* attribute: to unprivileged processes, those attributes are invisible (listxattr() won't include them).

This breaks xfstests 062.

The test does a "getfattr -n <name> <file>" for an attribute which cannot exist. The kernel now returns ENODATA instead of the previous EPERM.

One way to fix this in xfstests is to use listxattr(2) instead of getxattr(2), e.g.,

- getfattr -m $nsp -n $nsp.name2 $SCRATCH_MNT/$inode
+ getfattr -m $nsp.name2 $SCRATCH_MNT/$inode

Another is to accept ENODATA as well as EPERM. Not sure which is preferable.

Andreas