mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
ANDROID: overlayfs: add __get xattr method
Because of the overlayfs getxattr recursion, the incoming inode fails to update the selinux sid resulting in avc denials being reported against a target context of u:object_r:unlabeled:s0. Solution is to add a _get xattr method that calls the __vfs_getxattr handler so that the context can be read in, rather than being denied with an -EACCES when vfs_getxattr handler is called. Signed-off-by: Mark Salyzyn <salyzyn@google.com> Bug: 133515582 Bug: 136124883 Bug: 129319403 Change-Id: Ia39543c5ce617976f14d790fb88e471d575ffd65
This commit is contained in:
@@ -365,6 +365,21 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
|
||||
const char *name, void *value, size_t size)
|
||||
{
|
||||
ssize_t res;
|
||||
const struct cred *old_cred;
|
||||
struct dentry *realdentry =
|
||||
ovl_i_dentry_upper(inode) ?: ovl_dentry_lower(dentry);
|
||||
|
||||
old_cred = ovl_override_creds(dentry->d_sb);
|
||||
res = __vfs_getxattr(realdentry, d_inode(realdentry), name, value,
|
||||
size);
|
||||
ovl_revert_creds(old_cred);
|
||||
return res;
|
||||
}
|
||||
|
||||
int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
void *value, size_t size)
|
||||
{
|
||||
|
||||
@@ -351,6 +351,8 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
const void *value, size_t size, int flags);
|
||||
int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
void *value, size_t size);
|
||||
int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
|
||||
const char *name, void *value, size_t size);
|
||||
ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
|
||||
struct posix_acl *ovl_get_acl(struct inode *inode, int type);
|
||||
int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
|
||||
|
||||
@@ -885,6 +885,14 @@ ovl_posix_acl_xattr_get(const struct xattr_handler *handler,
|
||||
return ovl_xattr_get(dentry, inode, handler->name, buffer, size);
|
||||
}
|
||||
|
||||
static int __maybe_unused
|
||||
__ovl_posix_acl_xattr_get(const struct xattr_handler *handler,
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
const char *name, void *buffer, size_t size)
|
||||
{
|
||||
return __ovl_xattr_get(dentry, inode, handler->name, buffer, size);
|
||||
}
|
||||
|
||||
static int __maybe_unused
|
||||
ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
@@ -965,6 +973,13 @@ static int ovl_other_xattr_get(const struct xattr_handler *handler,
|
||||
return ovl_xattr_get(dentry, inode, name, buffer, size);
|
||||
}
|
||||
|
||||
static int __ovl_other_xattr_get(const struct xattr_handler *handler,
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
const char *name, void *buffer, size_t size)
|
||||
{
|
||||
return __ovl_xattr_get(dentry, inode, name, buffer, size);
|
||||
}
|
||||
|
||||
static int ovl_other_xattr_set(const struct xattr_handler *handler,
|
||||
struct dentry *dentry, struct inode *inode,
|
||||
const char *name, const void *value,
|
||||
@@ -978,6 +993,7 @@ ovl_posix_acl_access_xattr_handler = {
|
||||
.name = XATTR_NAME_POSIX_ACL_ACCESS,
|
||||
.flags = ACL_TYPE_ACCESS,
|
||||
.get = ovl_posix_acl_xattr_get,
|
||||
.__get = __ovl_posix_acl_xattr_get,
|
||||
.set = ovl_posix_acl_xattr_set,
|
||||
};
|
||||
|
||||
@@ -986,6 +1002,7 @@ ovl_posix_acl_default_xattr_handler = {
|
||||
.name = XATTR_NAME_POSIX_ACL_DEFAULT,
|
||||
.flags = ACL_TYPE_DEFAULT,
|
||||
.get = ovl_posix_acl_xattr_get,
|
||||
.__get = __ovl_posix_acl_xattr_get,
|
||||
.set = ovl_posix_acl_xattr_set,
|
||||
};
|
||||
|
||||
@@ -998,6 +1015,7 @@ static const struct xattr_handler ovl_own_xattr_handler = {
|
||||
static const struct xattr_handler ovl_other_xattr_handler = {
|
||||
.prefix = "", /* catch all */
|
||||
.get = ovl_other_xattr_get,
|
||||
.__get = __ovl_other_xattr_get,
|
||||
.set = ovl_other_xattr_set,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user