security/smack/smack_lsm.c

Source file repositories/reference/linux-study-clean/security/smack/smack_lsm.c

File Facts

System
Linux kernel
Corpus path
security/smack/smack_lsm.c
Extension
.c
Size
134470 bytes
Lines
5381
Domain
Core OS
Bucket
Security And Isolation
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct smack_mnt_opts {
	const char *fsdefault;
	const char *fsfloor;
	const char *fshat;
	const char *fsroot;
	const char *fstransmute;
};

static void smack_free_mnt_opts(void *mnt_opts)
{
	kfree(mnt_opts);
}

static int smack_add_opt(int token, const char *s, void **mnt_opts)
{
	struct smack_mnt_opts *opts = *mnt_opts;
	struct smack_known *skp;

	if (!opts) {
		opts = kzalloc_obj(struct smack_mnt_opts);
		if (!opts)
			return -ENOMEM;
		*mnt_opts = opts;
	}
	if (!s)
		return -ENOMEM;

	skp = smk_import_entry(s, 0);
	if (IS_ERR(skp))
		return PTR_ERR(skp);

	switch (token) {
	case Opt_fsdefault:
		if (opts->fsdefault)
			goto out_opt_err;
		opts->fsdefault = skp->smk_known;
		break;
	case Opt_fsfloor:
		if (opts->fsfloor)
			goto out_opt_err;
		opts->fsfloor = skp->smk_known;
		break;
	case Opt_fshat:
		if (opts->fshat)
			goto out_opt_err;
		opts->fshat = skp->smk_known;
		break;
	case Opt_fsroot:
		if (opts->fsroot)
			goto out_opt_err;
		opts->fsroot = skp->smk_known;
		break;
	case Opt_fstransmute:
		if (opts->fstransmute)
			goto out_opt_err;
		opts->fstransmute = skp->smk_known;
		break;
	}
	return 0;

out_opt_err:
	pr_warn("Smack: duplicate mount options\n");
	return -EINVAL;
}

/**
 * smack_fs_context_submount - Initialise security data for a filesystem context
 * @fc: The filesystem context.
 * @reference: reference superblock
 *
 * Returns 0 on success or -ENOMEM on error.
 */
static int smack_fs_context_submount(struct fs_context *fc,
				 struct super_block *reference)
{
	struct superblock_smack *sbsp;
	struct smack_mnt_opts *ctx;
	struct inode_smack *isp;

	ctx = kzalloc_obj(*ctx);
	if (!ctx)
		return -ENOMEM;
	fc->security = ctx;

	sbsp = smack_superblock(reference);
	isp = smack_inode(reference->s_root->d_inode);

	if (sbsp->smk_default) {
		ctx->fsdefault = kstrdup(sbsp->smk_default->smk_known, GFP_KERNEL);
		if (!ctx->fsdefault)

Annotation

Implementation Notes