linux/security/tomoyo/proxy.c

// SPDX-License-Identifier: GPL-2.0
/*
 * security/tomoyo/proxy.c
 *
 * Copyright (C) 2005-2011  NTT DATA CORPORATION
 */

#include <linux/security.h>
#include "common.h"

#ifdef CONFIG_SECURITY_TOMOYO_LKM

struct tomoyo_task *tomoyo_task(struct task_struct *task)
{
	struct tomoyo_task *s = task->security + tomoyo_blob_sizes.lbs_task;

	if (unlikely(!s->domain_info)) {
		if (likely(task == current)) {
			s->domain_info = &tomoyo_kernel_domain;
			atomic_inc(&tomoyo_kernel_domain.users);
		} else {
			/* Caller handles s->domain_info == NULL case. */
		}
	}
	return s;
}

#include "hooks.h"

/**
 * tomoyo_runtime_init - Register TOMOYO Linux as a loadable LSM module.
 *
 * Returns 0 if TOMOYO is enabled, -EINVAL otherwise.
 */
static int __init tomoyo_runtime_init(void)
{
	const struct tomoyo_hooks tomoyo_hooks = {
		.cred_prepare = tomoyo_cred_prepare,
		.bprm_committed_creds = tomoyo_bprm_committed_creds,
		.task_alloc = tomoyo_task_alloc,
		.task_free = tomoyo_task_free,
		.bprm_check_security = tomoyo_bprm_check_security,
		.file_fcntl = tomoyo_file_fcntl,
		.file_open = tomoyo_file_open,
		.file_truncate = tomoyo_file_truncate,
		.path_truncate = tomoyo_path_truncate,
		.path_unlink = tomoyo_path_unlink,
		.path_mkdir = tomoyo_path_mkdir,
		.path_rmdir = tomoyo_path_rmdir,
		.path_symlink = tomoyo_path_symlink,
		.path_mknod = tomoyo_path_mknod,
		.path_link = tomoyo_path_link,
		.path_rename = tomoyo_path_rename,
		.inode_getattr = tomoyo_inode_getattr,
		.file_ioctl = tomoyo_file_ioctl,
		.file_ioctl_compat = tomoyo_file_ioctl,
		.path_chmod = tomoyo_path_chmod,
		.path_chown = tomoyo_path_chown,
		.path_chroot = tomoyo_path_chroot,
		.sb_mount = tomoyo_sb_mount,
		.sb_umount = tomoyo_sb_umount,
		.sb_pivotroot = tomoyo_sb_pivotroot,
		.socket_bind = tomoyo_socket_bind,
		.socket_connect = tomoyo_socket_connect,
		.socket_listen = tomoyo_socket_listen,
		.socket_sendmsg = tomoyo_socket_sendmsg,
	};

	if (!tomoyo_ops.enabled)
		return -EINVAL;
	tomoyo_ops.check_profile = tomoyo_check_profile;
	pr_info("TOMOYO Linux initialized\n");
	tomoyo_task(current);
	tomoyo_mm_init();
	tomoyo_interface_init();
	tomoyo_register_hooks(&tomoyo_hooks);
	return 0;
}
module_init(tomoyo_runtime_init);
MODULE_LICENSE("GPL");

#endif