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

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

?? services.c

?? Linux Kernel 2.6.9 for OMAP1710
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/* * 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;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区二区三区不卡| 国产精品国产三级国产三级人妇| 欧美一区二区视频免费观看| 欧美成va人片在线观看| 中文字幕国产一区二区| 亚洲一区二区三区影院| 精品一区二区三区在线观看国产| 成人小视频在线观看| 在线观看www91| 欧美大片一区二区| 国产精品免费视频一区| 午夜视频一区二区三区| 国产乱妇无码大片在线观看| 色乱码一区二区三区88| 精品国产一二三| 亚洲人精品午夜| 久久精品免费看| 91精品办公室少妇高潮对白| 欧美电影免费观看高清完整版在 | 丝袜诱惑制服诱惑色一区在线观看| 日本欧洲一区二区| av网站免费线看精品| 91精品国产入口在线| 国产精品国产自产拍高清av| 肉丝袜脚交视频一区二区| www.在线成人| 日韩视频免费观看高清完整版在线观看 | 国产精品乱人伦中文| 香蕉成人伊视频在线观看| 粗大黑人巨茎大战欧美成人| 欧美日韩国产123区| 国产精品乱码人人做人人爱| 蜜桃传媒麻豆第一区在线观看| 成人av高清在线| 日韩精品中午字幕| 一区二区三区四区高清精品免费观看| 国产呦精品一区二区三区网站| 91福利视频在线| 欧美国产欧美综合| 久久丁香综合五月国产三级网站| 色哟哟在线观看一区二区三区| 久久综合资源网| 日韩和欧美一区二区| 91黄色免费网站| 国产精品伦一区| 国产精品18久久久久久久久久久久| 欧美肥妇bbw| 夜夜嗨av一区二区三区网页 | 国产精品久久久久久久久动漫| 麻豆久久一区二区| 欧美精品国产精品| 亚洲国产乱码最新视频| 成人av片在线观看| 国产拍揄自揄精品视频麻豆| 免费观看日韩av| 69久久99精品久久久久婷婷| 一区二区三区中文字幕| 99久久久精品免费观看国产蜜| 久久综合中文字幕| 国产一区二区三区在线看麻豆| 欧美一区二区三区在线观看视频| 亚洲高清不卡在线| 一本久久a久久精品亚洲| 国产精品毛片高清在线完整版 | 日本一区二区三区视频视频| 国内精品免费**视频| 日韩精品最新网址| 久久精品国产久精国产爱| 欧美一区二区在线不卡| 石原莉奈在线亚洲三区| 欧美日韩在线播| 五月婷婷综合在线| 欧美日本韩国一区二区三区视频| 亚洲国产精品人人做人人爽| 在线观看免费亚洲| 亚洲国产成人高清精品| 欧美日韩美少妇| 日韩国产在线一| 欧美一区二区精品| 九一久久久久久| 精品成人免费观看| 国产高清精品在线| 国产精品午夜免费| 色综合天天综合狠狠| 亚洲日本一区二区| 在线中文字幕一区| 亚洲成人av福利| 日韩一区二区三区免费观看| 久久精品国产久精国产| 久久理论电影网| 不卡的电视剧免费网站有什么| 成人免费一区二区三区视频 | 香蕉久久一区二区不卡无毒影院| 欧美日韩高清影院| 蜜桃久久久久久| 久久夜色精品国产噜噜av| 高清国产午夜精品久久久久久| 国产精品国产三级国产aⅴ无密码| 久久久久久久久久久久久久久99| 亚洲三级在线免费| 国产不卡免费视频| 综合欧美一区二区三区| 欧美色图免费看| 久久精品国产网站| 成人av资源在线观看| 亚洲欧美日韩久久| 3atv在线一区二区三区| 国产在线精品国自产拍免费| 亚洲欧美怡红院| 欧美一区二视频| www.欧美亚洲| 日日摸夜夜添夜夜添精品视频| 久久―日本道色综合久久| 99久久久久免费精品国产| 天堂影院一区二区| 国产校园另类小说区| 欧美亚洲动漫精品| 激情小说欧美图片| 亚洲欧美欧美一区二区三区| 91精品国产入口| 91亚洲精品久久久蜜桃网站| 日韩电影一区二区三区| 欧美国产精品劲爆| 欧美精品久久一区二区三区| 粉嫩av亚洲一区二区图片| 丝袜亚洲另类欧美| 国产精品欧美经典| 337p亚洲精品色噜噜噜| 成人午夜视频网站| 天天av天天翘天天综合网| 国产视频亚洲色图| 91极品美女在线| 成人一二三区视频| 日本不卡免费在线视频| 国产婷婷色一区二区三区| 欧美视频三区在线播放| 激情五月播播久久久精品| 亚洲国产视频网站| 久久久国产精品麻豆| 欧美群妇大交群的观看方式| 日本中文一区二区三区| 日韩美女精品在线| 精品国产一二三| 欧美日韩一区二区三区视频| fc2成人免费人成在线观看播放| 亚洲成人激情社区| 国产精品久久久久久亚洲伦| 欧美精品18+| 不卡av在线免费观看| 老司机午夜精品| 亚洲黄网站在线观看| 国产精品你懂的在线欣赏| 欧美日韩国产欧美日美国产精品| 国产ts人妖一区二区| 久久草av在线| 亚洲制服丝袜av| 国产精品久久夜| 日韩午夜中文字幕| 在线成人免费视频| 成人毛片视频在线观看| 国产美女视频一区| 伦理电影国产精品| 亚洲成人黄色小说| 亚洲成年人网站在线观看| 国产精品久久久一本精品| www国产成人| 日韩一区二区三区高清免费看看| 欧美猛男男办公室激情| 欧美色手机在线观看| 99久久久精品免费观看国产蜜| 国产福利91精品一区二区三区| 天天av天天翘天天综合网| 香港成人在线视频| 亚洲影院在线观看| 亚洲综合久久久久| 亚洲国产日韩精品| 亚洲一区二区三区自拍| 亚洲综合久久av| 亚洲精品欧美激情| 一区二区在线看| 国产欧美日韩中文久久| 国产喷白浆一区二区三区| 国产欧美精品一区二区色综合朱莉| 欧美mv日韩mv| 久久精品夜色噜噜亚洲aⅴ| 91精品国产色综合久久不卡电影| 91精品国产品国语在线不卡| 色伊人久久综合中文字幕| 99国产麻豆精品| 一本色道久久综合狠狠躁的推荐 | 91精品国产福利| 欧美日韩国产美| 91精品国产全国免费观看| 欧美日韩国产一二三| 6080日韩午夜伦伦午夜伦| 91玉足脚交白嫩脚丫在线播放| 99精品视频一区二区| 在线一区二区三区做爰视频网站| 色先锋资源久久综合| 欧美性大战久久久久久久蜜臀|