亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? services.c

?? 優(yōu)龍2410linux2.6.8內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Implementation of the security services. * * Authors : Stephen Smalley, <sds@epoch.ncsc.mil> *           James Morris <jmorris@redhat.com> * *  Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> * *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2, *      as published by the Free Software Foundation. * * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com> * * 	Added conditional policy language extensions * * Copyright (C) 2003 - 2004 Tresys Technology, LLC *	This program is free software; you can redistribute it and/or modify *  	it under the terms of the GNU General Public License as published by *	the Free Software Foundation, version 2. */#include <linux/kernel.h>#include <linux/slab.h>#include <linux/string.h>#include <linux/spinlock.h>#include <linux/errno.h>#include <linux/in.h>#include <linux/sched.h>#include <linux/audit.h>#include <asm/semaphore.h>#include "flask.h"#include "avc.h"#include "avc_ss.h"#include "security.h"#include "context.h"#include "policydb.h"#include "sidtab.h"#include "services.h"#include "conditional.h"#include "mls.h"extern void selnl_notify_policyload(u32 seqno);extern int policydb_loaded_version;static rwlock_t policy_rwlock = RW_LOCK_UNLOCKED;#define POLICY_RDLOCK read_lock(&policy_rwlock)#define POLICY_WRLOCK write_lock_irq(&policy_rwlock)#define POLICY_RDUNLOCK read_unlock(&policy_rwlock)#define POLICY_WRUNLOCK write_unlock_irq(&policy_rwlock)static DECLARE_MUTEX(load_sem);#define LOAD_LOCK down(&load_sem)#define LOAD_UNLOCK up(&load_sem)struct sidtab sidtab;struct policydb policydb;int ss_initialized = 0;/* * The largest sequence number that has been used when * providing an access decision to the access vector cache. * The sequence number only changes when a policy change * occurs. */static u32 latest_granting = 0;/* * Return the boolean value of a constraint expression * when it is applied to the specified source and target * security contexts. */static int constraint_expr_eval(struct context *scontext,				struct context *tcontext,				struct constraint_expr *cexpr){	u32 val1, val2;	struct context *c;	struct role_datum *r1, *r2;	struct constraint_expr *e;	int s[CEXPR_MAXDEPTH];	int sp = -1;	for (e = cexpr; e; e = e->next) {		switch (e->expr_type) {		case CEXPR_NOT:			BUG_ON(sp < 0);			s[sp] = !s[sp];			break;		case CEXPR_AND:			BUG_ON(sp < 1);			sp--;			s[sp] &= s[sp+1];			break;		case CEXPR_OR:			BUG_ON(sp < 1);			sp--;			s[sp] |= s[sp+1];			break;		case CEXPR_ATTR:			if (sp == (CEXPR_MAXDEPTH-1))				return 0;			switch (e->attr) {			case CEXPR_USER:				val1 = scontext->user;				val2 = tcontext->user;				break;			case CEXPR_TYPE:				val1 = scontext->type;				val2 = tcontext->type;				break;			case CEXPR_ROLE:				val1 = scontext->role;				val2 = tcontext->role;				r1 = policydb.role_val_to_struct[val1 - 1];				r2 = policydb.role_val_to_struct[val2 - 1];				switch (e->op) {				case CEXPR_DOM:					s[++sp] = ebitmap_get_bit(&r1->dominates,								  val2 - 1);					continue;				case CEXPR_DOMBY:					s[++sp] = ebitmap_get_bit(&r2->dominates,								  val1 - 1);					continue;				case CEXPR_INCOMP:					s[++sp] = ( !ebitmap_get_bit(&r1->dominates,								     val2 - 1) &&						    !ebitmap_get_bit(&r2->dominates,								     val1 - 1) );					continue;				default:					break;				}				break;			default:				BUG();				return 0;			}			switch (e->op) {			case CEXPR_EQ:				s[++sp] = (val1 == val2);				break;			case CEXPR_NEQ:				s[++sp] = (val1 != val2);				break;			default:				BUG();				return 0;			}			break;		case CEXPR_NAMES:			if (sp == (CEXPR_MAXDEPTH-1))				return 0;			c = scontext;			if (e->attr & CEXPR_TARGET)				c = tcontext;			if (e->attr & CEXPR_USER)				val1 = c->user;			else if (e->attr & CEXPR_ROLE)				val1 = c->role;			else if (e->attr & CEXPR_TYPE)				val1 = c->type;			else {				BUG();				return 0;			}			switch (e->op) {			case CEXPR_EQ:				s[++sp] = ebitmap_get_bit(&e->names, val1 - 1);				break;			case CEXPR_NEQ:				s[++sp] = !ebitmap_get_bit(&e->names, val1 - 1);				break;			default:				BUG();				return 0;			}			break;		default:			BUG();			return 0;		}	}	BUG_ON(sp != 0);	return s[0];}/* * Compute access vectors based on a context structure pair for * the permissions in a particular class. */static int context_struct_compute_av(struct context *scontext,				     struct context *tcontext,				     u16 tclass,				     u32 requested,				     struct av_decision *avd){	struct constraint_node *constraint;	struct role_allow *ra;	struct avtab_key avkey;	struct avtab_datum *avdatum;	struct class_datum *tclass_datum;	/*	 * Remap extended Netlink classes for old policy versions.	 * Do this here rather than socket_type_to_security_class()	 * in case a newer policy version is loaded, allowing sockets	 * to remain in the correct class.	 */	if (policydb_loaded_version < POLICYDB_VERSION_NLCLASS)		if (tclass >= SECCLASS_NETLINK_ROUTE_SOCKET &&		    tclass <= SECCLASS_NETLINK_DNRT_SOCKET)			tclass = SECCLASS_NETLINK_SOCKET;	if (!tclass || tclass > policydb.p_classes.nprim) {		printk(KERN_ERR "security_compute_av:  unrecognized class %d\n",		       tclass);		return -EINVAL;	}	tclass_datum = policydb.class_val_to_struct[tclass - 1];	/*	 * Initialize the access vectors to the default values.	 */	avd->allowed = 0;	avd->decided = 0xffffffff;	avd->auditallow = 0;	avd->auditdeny = 0xffffffff;	avd->seqno = latest_granting;	/*	 * If a specific type enforcement rule was defined for	 * this permission check, then use it.	 */	avkey.source_type = scontext->type;	avkey.target_type = tcontext->type;	avkey.target_class = tclass;	avdatum = avtab_search(&policydb.te_avtab, &avkey, AVTAB_AV);	if (avdatum) {		if (avdatum->specified & AVTAB_ALLOWED)			avd->allowed = avtab_allowed(avdatum);		if (avdatum->specified & AVTAB_AUDITDENY)			avd->auditdeny = avtab_auditdeny(avdatum);		if (avdatum->specified & AVTAB_AUDITALLOW)			avd->auditallow = avtab_auditallow(avdatum);	}	/* Check conditional av table for additional permissions */	cond_compute_av(&policydb.te_cond_avtab, &avkey, avd);	/*	 * Remove any permissions prohibited by the MLS policy.	 */	mls_compute_av(scontext, tcontext, tclass_datum, &avd->allowed);	/*	 * Remove any permissions prohibited by a constraint.	 */	constraint = tclass_datum->constraints;	while (constraint) {		if ((constraint->permissions & (avd->allowed)) &&		    !constraint_expr_eval(scontext, tcontext,					  constraint->expr)) {			avd->allowed = (avd->allowed) & ~(constraint->permissions);		}		constraint = constraint->next;	}	/*	 * If checking process transition permission and the	 * role is changing, then check the (current_role, new_role)	 * pair.	 */	if (tclass == SECCLASS_PROCESS &&	    (avd->allowed & PROCESS__TRANSITION) &&	    scontext->role != tcontext->role) {		for (ra = policydb.role_allow; ra; ra = ra->next) {			if (scontext->role == ra->role &&			    tcontext->role == ra->new_role)				break;		}		if (!ra)			avd->allowed = (avd->allowed) & ~(PROCESS__TRANSITION);	}	return 0;}/** * security_compute_av - Compute access vector decisions. * @ssid: source security identifier * @tsid: target security identifier * @tclass: target security class * @requested: requested permissions * @avd: access vector decisions * * Compute a set of access vector decisions based on the * SID pair (@ssid, @tsid) for the permissions in @tclass. * Return -%EINVAL if any of the parameters are invalid or %0 * if the access vector decisions were computed successfully. */int security_compute_av(u32 ssid,			u32 tsid,			u16 tclass,			u32 requested,			struct av_decision *avd){	struct context *scontext = NULL, *tcontext = NULL;	int rc = 0;	if (!ss_initialized) {		avd->allowed = requested;		avd->decided = requested;		avd->auditallow = 0;		avd->auditdeny = 0xffffffff;		avd->seqno = latest_granting;		return 0;	}	POLICY_RDLOCK;	scontext = sidtab_search(&sidtab, ssid);	if (!scontext) {		printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",		       ssid);		rc = -EINVAL;		goto out;	}	tcontext = sidtab_search(&sidtab, tsid);	if (!tcontext) {		printk(KERN_ERR "security_compute_av:  unrecognized SID %d\n",		       tsid);		rc = -EINVAL;		goto out;	}	rc = context_struct_compute_av(scontext, tcontext, tclass,				       requested, avd);out:	POLICY_RDUNLOCK;	return rc;}/* * Write the security context string representation of * the context structure `context' into a dynamically * allocated string of the correct size.  Set `*scontext' * to point to this string and set `*scontext_len' to * the length of the string. */int context_struct_to_string(struct context *context, char **scontext, u32 *scontext_len){	char *scontextp;	*scontext = NULL;	*scontext_len = 0;	/* Compute the size of the context. */	*scontext_len += strlen(policydb.p_user_val_to_name[context->user - 1]) + 1;	*scontext_len += strlen(policydb.p_role_val_to_name[context->role - 1]) + 1;	*scontext_len += strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;	*scontext_len += mls_compute_context_len(context);	/* Allocate space for the context; caller must free this space. */	scontextp = kmalloc(*scontext_len+1,GFP_ATOMIC);	if (!scontextp) {		return -ENOMEM;	}	*scontext = scontextp;	/*	 * Copy the user name, role name and type name into the context.	 */	sprintf(scontextp, "%s:%s:%s:",		policydb.p_user_val_to_name[context->user - 1],		policydb.p_role_val_to_name[context->role - 1],		policydb.p_type_val_to_name[context->type - 1]);	scontextp += strlen(policydb.p_user_val_to_name[context->user - 1]) +	             1 + strlen(policydb.p_role_val_to_name[context->role - 1]) +	             1 + strlen(policydb.p_type_val_to_name[context->type - 1]) + 1;	mls_sid_to_context(context, &scontextp);	scontextp--;	*scontextp = 0;	return 0;}#include "initial_sid_to_string.h"/** * security_sid_to_context - Obtain a context for a given SID. * @sid: security identifier, SID * @scontext: security context * @scontext_len: length in bytes * * Write the string representation of the context associated with @sid * into a dynamically allocated string of the correct size.  Set @scontext * to point to this string and set @scontext_len to the length of the string. */int security_sid_to_context(u32 sid, char **scontext, u32 *scontext_len){	struct context *context;	int rc = 0;	if (!ss_initialized) {		if (sid <= SECINITSID_NUM) {			char *scontextp;			*scontext_len = strlen(initial_sid_to_string[sid]) + 1;			scontextp = kmalloc(*scontext_len,GFP_ATOMIC);			strcpy(scontextp, initial_sid_to_string[sid]);			*scontext = scontextp;			goto out;		}		printk(KERN_ERR "security_sid_to_context:  called before initial "		       "load_policy on unknown SID %d\n", sid);		rc = -EINVAL;		goto out;	}	POLICY_RDLOCK;	context = sidtab_search(&sidtab, sid);	if (!context) {		printk(KERN_ERR "security_sid_to_context:  unrecognized SID "		       "%d\n", sid);		rc = -EINVAL;		goto out_unlock;	}	rc = context_struct_to_string(context, scontext, scontext_len);out_unlock:	POLICY_RDUNLOCK;out:	return rc;}/** * security_context_to_sid - Obtain a SID for a given security context. * @scontext: security context * @scontext_len: length in bytes * @sid: security identifier, SID * * Obtains a SID associated with the security context that * has the string representation specified by @scontext. * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient * memory is available, or 0 on success. */int security_context_to_sid(char *scontext, u32 scontext_len, u32 *sid){	char *scontext2;	struct context context;	struct role_datum *role;	struct type_datum *typdatum;	struct user_datum *usrdatum;	char *scontextp, *p, oldc;	int rc = 0;	if (!ss_initialized) {		int i;		for (i = 1; i < SECINITSID_NUM; i++) {			if (!strcmp(initial_sid_to_string[i], scontext)) {				*sid = i;				goto out;			}		}		*sid = SECINITSID_KERNEL;		goto out;	}	*sid = SECSID_NULL;	/* Copy the string so that we can modify the copy as we parse it.	   The string should already by null terminated, but we append a	   null suffix to the copy to avoid problems with the existing	   attr package, which doesn't view the null terminator as part	   of the attribute value. */	scontext2 = kmalloc(scontext_len+1,GFP_KERNEL);	if (!scontext2) {		rc = -ENOMEM;		goto out;	}	memcpy(scontext2, scontext, scontext_len);	scontext2[scontext_len] = 0;	context_init(&context);	*sid = SECSID_NULL;	POLICY_RDLOCK;	/* Parse the security context. */	rc = -EINVAL;	scontextp = (char *) scontext2;	/* Extract the user. */	p = scontextp;	while (*p && *p != ':')		p++;	if (*p == 0)		goto out_unlock;	*p++ = 0;	usrdatum = hashtab_search(policydb.p_users.table, scontextp);	if (!usrdatum)		goto out_unlock;	context.user = usrdatum->value;	/* Extract role. */	scontextp = p;	while (*p && *p != ':')		p++;	if (*p == 0)		goto out_unlock;	*p++ = 0;	role = hashtab_search(policydb.p_roles.table, scontextp);	if (!role)		goto out_unlock;	context.role = role->value;	/* Extract type. */	scontextp = p;	while (*p && *p != ':')		p++;	oldc = *p;	*p++ = 0;	typdatum = hashtab_search(policydb.p_types.table, scontextp);	if (!typdatum)		goto out_unlock;	context.type = typdatum->value;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品乱码人人做人人爱| 中文av一区特黄| 国产成人高清视频| 亚洲国产一二三| 国产视频一区不卡| 欧美日韩一区二区三区在线| 国产激情一区二区三区| 亚洲综合色视频| 国产午夜精品久久| 3atv一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 粉嫩高潮美女一区二区三区| 亚洲国产视频在线| 国产精品久久久久久久久快鸭| 欧美一区二区三区在线电影| 91免费版pro下载短视频| 久久精品国产色蜜蜜麻豆| 亚洲猫色日本管| 国产欧美一区二区三区在线看蜜臀| 欧美日韩久久一区二区| 91在线观看美女| 国产精品99久久久久久似苏梦涵 | 欧美变态凌虐bdsm| 日本国产一区二区| 北条麻妃一区二区三区| 狠狠狠色丁香婷婷综合激情| 午夜欧美2019年伦理| 亚洲女同女同女同女同女同69| 亚洲国产精品v| 久久久久一区二区三区四区| 日韩欧美国产一二三区| 在线成人av影院| 欧美伦理电影网| 在线观看国产一区二区| 色狠狠一区二区三区香蕉| a4yy欧美一区二区三区| av在线播放不卡| 成人爽a毛片一区二区免费| 国产剧情一区二区| 国产乱码精品一品二品| 国产在线不卡视频| 国产剧情在线观看一区二区| 国产一区二区调教| 国产精品资源网| 丁香桃色午夜亚洲一区二区三区| 激情图区综合网| 国产毛片一区二区| 国产99一区视频免费| 国产91清纯白嫩初高中在线观看| 国产一区 二区 三区一级| 国产精品亚洲一区二区三区在线| 国产麻豆精品久久一二三| 国产精品一二三四| 波多野结衣在线一区| av一本久道久久综合久久鬼色| a美女胸又www黄视频久久| 99久久免费精品高清特色大片| 99久久伊人久久99| 色婷婷av一区二区三区软件 | 在线视频一区二区三| 欧美亚洲一区三区| 日韩一区二区三区在线观看| 日韩三级电影网址| 国产亚洲va综合人人澡精品| 中文字幕制服丝袜成人av| 亚洲乱码国产乱码精品精小说 | 在线播放一区二区三区| 91精品久久久久久久99蜜桃 | 欧美一区二区三区视频免费播放| 欧美一区二区视频在线观看2022| 欧美成人午夜电影| 中文字幕国产一区| 亚洲最大成人网4388xx| 免费在线观看视频一区| 国产一区二区视频在线| 91丨porny丨最新| 宅男噜噜噜66一区二区66| 久久人人超碰精品| 亚洲欧美另类图片小说| 欧美a级一区二区| 成人午夜激情影院| 欧美日韩亚洲综合在线| 2020国产成人综合网| 亚洲视频在线一区| 美女脱光内衣内裤视频久久影院| 国产成人亚洲精品青草天美| 色噜噜夜夜夜综合网| 精品国产露脸精彩对白| 亚洲免费在线视频| 黑人巨大精品欧美一区| 色哦色哦哦色天天综合| 日韩欧美一区电影| 亚洲女女做受ⅹxx高潮| 韩国av一区二区三区| 欧美亚洲综合网| 中文字幕欧美三区| 天堂在线亚洲视频| 99国产精品久久久| 精品国产91洋老外米糕| 亚洲综合色视频| 成人精品视频一区二区三区 | 国产成人一级电影| 欧美精品久久天天躁| 国产精品第一页第二页第三页| 日韩精品成人一区二区在线| av在线一区二区| 久久蜜桃香蕉精品一区二区三区| 五月婷婷综合网| 91视频免费播放| 久久日韩精品一区二区五区| 亚洲高清不卡在线观看| 成人高清视频在线| 久久影视一区二区| 日韩国产欧美在线观看| 色国产综合视频| 国产精品亲子伦对白| 韩国v欧美v日本v亚洲v| 91精品国产综合久久精品麻豆 | 美女性感视频久久| 欧美特级限制片免费在线观看| 国产精品欧美综合在线| 国产精品一二二区| 精品日韩在线一区| 免费成人结看片| 欧美年轻男男videosbes| 中文字幕在线不卡一区二区三区| 国产精品综合在线视频| 精品国产亚洲在线| 久久99久久精品| 精品国产凹凸成av人导航| 日本女优在线视频一区二区| 欧美猛男男办公室激情| 性做久久久久久久免费看| 欧美在线一区二区| 一区二区三区av电影| av一本久道久久综合久久鬼色| 久久久久久久久免费| 国产乱色国产精品免费视频| 精品国产123| 黄色成人免费在线| 久久久亚洲综合| 国产在线精品一区二区| 精品国产免费人成电影在线观看四季 | 91精品欧美一区二区三区综合在 | 午夜日韩在线电影| 在线不卡a资源高清| 日韩**一区毛片| 日韩欧美电影在线| 久久99精品久久久久婷婷| 久久综合久色欧美综合狠狠| 国模无码大尺度一区二区三区| 久久夜色精品一区| 国产·精品毛片| 中文字幕欧美激情一区| 91在线你懂得| 亚洲图片一区二区| 欧美精品亚洲二区| 美女在线一区二区| 国产女人aaa级久久久级| 成人ar影院免费观看视频| 亚洲人123区| 欧美日韩黄色影视| 久久国产精品色| 国产精品女人毛片| 色婷婷综合久色| 日韩综合在线视频| 国产亚洲精品福利| 91成人国产精品| 久久精品国产一区二区三区免费看| 日韩精品最新网址| 岛国一区二区在线观看| 亚洲老妇xxxxxx| 日韩欧美卡一卡二| 成人夜色视频网站在线观看| 一区二区三区免费观看| 欧美日本韩国一区| 国产成人精品免费网站| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩电影一区| 国产大陆精品国产| 一区二区欧美国产| 精品国产一区二区三区久久影院| 成人福利电影精品一区二区在线观看 | 成人手机电影网| 日韩精品午夜视频| 国产精品女同互慰在线看| 欧美日本在线视频| 成人激情小说乱人伦| 婷婷久久综合九色国产成人 | 久久综合av免费| 欧美特级限制片免费在线观看| 国产一区二区福利视频| 一区二区三区精品视频在线| 精品国一区二区三区| 精品视频1区2区| 成人听书哪个软件好| 蜜臀av一区二区在线免费观看| 亚洲欧美日韩中文播放| www国产成人| 51精品视频一区二区三区|