mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
2a7dba391e
SELinux would like to implement a new labeling behavior of newly created inodes. We currently label new inodes based on the parent and the creating process. This new behavior would also take into account the name of the new object when deciding the new label. This is not the (supposed) full path, just the last component of the path. This is very useful because creating /etc/shadow is different than creating /etc/passwd but the kernel hooks are unable to differentiate these operations. We currently require that userspace realize it is doing some difficult operation like that and than userspace jumps through SELinux hoops to get things set up correctly. This patch does not implement new behavior, that is obviously contained in a seperate SELinux patch, but it does pass the needed name down to the correct LSM hook. If no such name exists it is fine to pass NULL. Signed-off-by: Eric Paris <eparis@redhat.com>
87 lines
2.1 KiB
C
87 lines
2.1 KiB
C
/*
|
|
* JFFS2 -- Journalling Flash File System, Version 2.
|
|
*
|
|
* Copyright © 2006 NEC Corporation
|
|
*
|
|
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
|
|
*
|
|
* For licensing information, see the file 'LICENCE' in this directory.
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/time.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/highmem.h>
|
|
#include <linux/crc32.h>
|
|
#include <linux/jffs2.h>
|
|
#include <linux/xattr.h>
|
|
#include <linux/mtd/mtd.h>
|
|
#include <linux/security.h>
|
|
#include "nodelist.h"
|
|
|
|
/* ---- Initial Security Label Attachment -------------- */
|
|
int jffs2_init_security(struct inode *inode, struct inode *dir,
|
|
const struct qstr *qstr)
|
|
{
|
|
int rc;
|
|
size_t len;
|
|
void *value;
|
|
char *name;
|
|
|
|
rc = security_inode_init_security(inode, dir, qstr, &name, &value, &len);
|
|
if (rc) {
|
|
if (rc == -EOPNOTSUPP)
|
|
return 0;
|
|
return rc;
|
|
}
|
|
rc = do_jffs2_setxattr(inode, JFFS2_XPREFIX_SECURITY, name, value, len, 0);
|
|
|
|
kfree(name);
|
|
kfree(value);
|
|
return rc;
|
|
}
|
|
|
|
/* ---- XATTR Handler for "security.*" ----------------- */
|
|
static int jffs2_security_getxattr(struct dentry *dentry, const char *name,
|
|
void *buffer, size_t size, int type)
|
|
{
|
|
if (!strcmp(name, ""))
|
|
return -EINVAL;
|
|
|
|
return do_jffs2_getxattr(dentry->d_inode, JFFS2_XPREFIX_SECURITY,
|
|
name, buffer, size);
|
|
}
|
|
|
|
static int jffs2_security_setxattr(struct dentry *dentry, const char *name,
|
|
const void *buffer, size_t size, int flags, int type)
|
|
{
|
|
if (!strcmp(name, ""))
|
|
return -EINVAL;
|
|
|
|
return do_jffs2_setxattr(dentry->d_inode, JFFS2_XPREFIX_SECURITY,
|
|
name, buffer, size, flags);
|
|
}
|
|
|
|
static size_t jffs2_security_listxattr(struct dentry *dentry, char *list,
|
|
size_t list_size, const char *name, size_t name_len, int type)
|
|
{
|
|
size_t retlen = XATTR_SECURITY_PREFIX_LEN + name_len + 1;
|
|
|
|
if (list && retlen <= list_size) {
|
|
strcpy(list, XATTR_SECURITY_PREFIX);
|
|
strcpy(list + XATTR_SECURITY_PREFIX_LEN, name);
|
|
}
|
|
|
|
return retlen;
|
|
}
|
|
|
|
const struct xattr_handler jffs2_security_xattr_handler = {
|
|
.prefix = XATTR_SECURITY_PREFIX,
|
|
.list = jffs2_security_listxattr,
|
|
.set = jffs2_security_setxattr,
|
|
.get = jffs2_security_getxattr
|
|
};
|