![Eric W. Biederman](/assets/img/avatar_default.png)
- In setxattr if we are setting a posix acl convert uids and gids from the current user namespace into the initial user namespace, before the xattrs are passed to the underlying filesystem. Untranslatable uids and gids are represented as -1 which posix_acl_from_xattr will represent as INVALID_UID or INVALID_GID. posix_acl_valid will fail if an acl from userspace has any INVALID_UID or INVALID_GID values. In net this guarantees that untranslatable posix acls will not be stored by filesystems. - In getxattr if we are reading a posix acl convert uids and gids from the initial user namespace into the current user namespace. Uids and gids that can not be tranlsated into the current user namespace will be represented as -1. - Replace e_id in struct posix_acl_entry with an anymouns union of e_uid and e_gid. For the short term retain the e_id field until all of the users are converted. - Don't set struct posix_acl.e_id in the cases where the acl type does not use e_id. Greatly reducing the use of ACL_UNDEFINED_ID. - Rework the ordering checks in posix_acl_valid so that I use kuid_t and kgid_t types throughout the code, and so that I don't need arithmetic on uid and gid types. Cc: Theodore Tso <tytso@mit.edu> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andreas Dilger <adilger.kernel@dilger.ca> Cc: Jan Kara <jack@suse.cz> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
71 lines
1.7 KiB
C
71 lines
1.7 KiB
C
/*
|
|
File: linux/posix_acl_xattr.h
|
|
|
|
Extended attribute system call representation of Access Control Lists.
|
|
|
|
Copyright (C) 2000 by Andreas Gruenbacher <a.gruenbacher@computer.org>
|
|
Copyright (C) 2002 SGI - Silicon Graphics, Inc <linux-xfs@oss.sgi.com>
|
|
*/
|
|
#ifndef _POSIX_ACL_XATTR_H
|
|
#define _POSIX_ACL_XATTR_H
|
|
|
|
#include <linux/posix_acl.h>
|
|
|
|
/* Extended attribute names */
|
|
#define POSIX_ACL_XATTR_ACCESS "system.posix_acl_access"
|
|
#define POSIX_ACL_XATTR_DEFAULT "system.posix_acl_default"
|
|
|
|
/* Supported ACL a_version fields */
|
|
#define POSIX_ACL_XATTR_VERSION 0x0002
|
|
|
|
|
|
/* An undefined entry e_id value */
|
|
#define ACL_UNDEFINED_ID (-1)
|
|
|
|
typedef struct {
|
|
__le16 e_tag;
|
|
__le16 e_perm;
|
|
__le32 e_id;
|
|
} posix_acl_xattr_entry;
|
|
|
|
typedef struct {
|
|
__le32 a_version;
|
|
posix_acl_xattr_entry a_entries[0];
|
|
} posix_acl_xattr_header;
|
|
|
|
|
|
static inline size_t
|
|
posix_acl_xattr_size(int count)
|
|
{
|
|
return (sizeof(posix_acl_xattr_header) +
|
|
(count * sizeof(posix_acl_xattr_entry)));
|
|
}
|
|
|
|
static inline int
|
|
posix_acl_xattr_count(size_t size)
|
|
{
|
|
if (size < sizeof(posix_acl_xattr_header))
|
|
return -1;
|
|
size -= sizeof(posix_acl_xattr_header);
|
|
if (size % sizeof(posix_acl_xattr_entry))
|
|
return -1;
|
|
return size / sizeof(posix_acl_xattr_entry);
|
|
}
|
|
|
|
#ifdef CONFIG_FS_POSIX_ACL
|
|
void posix_acl_fix_xattr_from_user(void *value, size_t size);
|
|
void posix_acl_fix_xattr_to_user(void *value, size_t size);
|
|
#else
|
|
static inline void posix_acl_fix_xattr_from_user(void *value, size_t size)
|
|
{
|
|
}
|
|
static inline void posix_acl_fix_xattr_to_user(void *value, size_t size)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
struct posix_acl *posix_acl_from_xattr(const void *value, size_t size);
|
|
int posix_acl_to_xattr(const struct posix_acl *acl, void *buffer, size_t size);
|
|
|
|
#endif /* _POSIX_ACL_XATTR_H */
|