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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? services.c

?? h內核
?? 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);unsigned int policydb_loaded_version;static DEFINE_RWLOCK(policy_rwlock);#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 | PROCESS__DYNTRANSITION)) &&	    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 |			                                PROCESS__DYNTRANSITION);	}	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;	rc = mls_context_to_sid(oldc, &p, &context);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品网站免费观看| 青青草国产成人99久久| 日韩福利电影在线| 成人天堂资源www在线| 日韩一区二区在线观看视频播放| 国产精品第五页| 精品一区二区免费| 欧美日韩国产高清一区| 国产精品美女久久福利网站| 九色综合狠狠综合久久| 欧美日韩高清在线| 亚洲视频香蕉人妖| 成人美女在线观看| 国产精品入口麻豆九色| 国产永久精品大片wwwapp| 欧美一级片免费看| 亚洲成a人片在线不卡一二三区 | 欧美天堂一区二区三区| 国产精品网友自拍| 国产成人在线视频网站| 久久久午夜精品理论片中文字幕| 日本不卡123| 69精品人人人人| 亚洲国产成人av| 在线看日本不卡| 亚洲美女淫视频| av爱爱亚洲一区| 国产精品欧美一级免费| 波多野结衣中文字幕一区| 中文幕一区二区三区久久蜜桃| 精品一区二区综合| 欧美精品一区二区三区四区 | 亚瑟在线精品视频| 欧美午夜精品久久久久久超碰| 一区二区国产视频| 色网综合在线观看| 亚洲三级小视频| 色婷婷亚洲婷婷| 亚洲一区二区三区视频在线| 欧洲另类一二三四区| 亚洲成av人**亚洲成av**| 欧美久久久久久久久久| 舔着乳尖日韩一区| 欧美电影精品一区二区| 精品在线观看视频| 国产欧美日韩另类一区| av一区二区三区在线| 亚洲在线视频网站| 欧美一区二区在线看| 韩国欧美国产1区| 国产精品电影一区二区| 在线观看视频欧美| 精品中文字幕一区二区 | 欧美mv日韩mv亚洲| 国产精品1区二区.| 亚洲另类中文字| 3atv在线一区二区三区| 国产成人综合在线观看| 亚洲免费大片在线观看| 欧美一区二区视频在线观看2022 | 麻豆91在线播放| 久久精品男人天堂av| 91捆绑美女网站| 日本成人中文字幕| 国产精品久久久久影院老司 | 精品国产成人系列| 99国产精品久久| 六月丁香婷婷久久| 亚洲日本一区二区| 日韩欧美激情在线| 91在线你懂得| 国产在线日韩欧美| 亚洲一区二区三区视频在线| 国产亚洲一区二区在线观看| 欧美亚洲国产bt| 国产91丝袜在线18| 丝袜国产日韩另类美女| 国产精品乱人伦中文| 日韩一区二区三区三四区视频在线观看 | 亚洲色图.com| 日韩美女视频一区二区在线观看| 成人免费的视频| 久久av中文字幕片| 亚洲综合激情另类小说区| 久久久国产一区二区三区四区小说 | 成人免费一区二区三区在线观看| 欧美巨大另类极品videosbest | 亚洲国产va精品久久久不卡综合| 久久久久久久综合| 91精品国产综合久久香蕉的特点 | 久久久综合视频| 91精品国产色综合久久ai换脸| www.欧美色图| 国产精品1024| 国内精品免费在线观看| 日韩**一区毛片| 亚洲成人黄色影院| 亚洲日本青草视频在线怡红院| 国产欧美日韩视频在线观看| 精品国产电影一区二区| 日韩网站在线看片你懂的| 欧美日韩精品一区二区三区| 91丨porny丨首页| 99久久伊人精品| av午夜一区麻豆| 国产.欧美.日韩| 国产盗摄女厕一区二区三区| 美腿丝袜亚洲综合| 日本中文字幕一区二区视频| 日韩精品成人一区二区在线| 亚洲影视资源网| 午夜精品一区二区三区电影天堂| 亚洲一区二区精品久久av| 亚洲欧美激情小说另类| 亚洲精选视频在线| 一卡二卡三卡日韩欧美| 亚洲第一二三四区| 日韩国产欧美视频| 青青草原综合久久大伊人精品优势| 日韩中文字幕91| 日韩av在线发布| 国产综合成人久久大片91| 国产成人精品亚洲日本在线桃色| 国产综合色在线视频区| 懂色一区二区三区免费观看| 99riav久久精品riav| 色婷婷一区二区| 欧美高清你懂得| 精品卡一卡二卡三卡四在线| 久久久国产综合精品女国产盗摄| 欧美国产激情一区二区三区蜜月| 国产精品国产自产拍高清av| 亚洲色图欧美偷拍| 日韩精品一区第一页| 韩国三级电影一区二区| 成人黄色一级视频| 欧美中文字幕一二三区视频| 欧美一区二区三区系列电影| 久久久久久久久久久久久女国产乱 | 色婷婷综合久久久久中文一区二区| 日本精品免费观看高清观看| 欧美精品日韩一本| 久久理论电影网| 亚洲精品视频观看| 蜜桃精品视频在线观看| 成人av网在线| 欧美一区二区三区免费在线看| 日本一区二区视频在线| 亚洲大片免费看| 国产精品996| 在线观看一区二区视频| 久久久亚洲精品石原莉奈| 亚洲综合丁香婷婷六月香| 国产另类ts人妖一区二区| 欧美影院精品一区| 国产欧美一区二区精品性色| 亚洲大片在线观看| 成人午夜免费av| 日韩欧美一区二区在线视频| 亚洲人成网站色在线观看| 日本伊人精品一区二区三区观看方式| 国产成人高清视频| 欧美一区二区精品在线| 亚洲婷婷国产精品电影人久久| 日韩av二区在线播放| 91久久精品一区二区三区| 国产日韩av一区| 美女视频网站久久| 欧美日韩国产综合久久| 国产精品久久久久7777按摩| 久久精品国产99久久6| 欧美亚日韩国产aⅴ精品中极品| 国产精品天美传媒| 激情综合网av| 91精品久久久久久久99蜜桃| 一区二区三区毛片| 99久久精品免费观看| 久久久精品综合| 久久丁香综合五月国产三级网站 | 精品国产网站在线观看| 天天av天天翘天天综合网色鬼国产| av高清不卡在线| 亚洲国产精品成人久久综合一区| 久久av中文字幕片| 欧美一区二区不卡视频| 石原莉奈在线亚洲三区| 欧美日韩一区不卡| 亚洲国产另类精品专区| 欧美系列亚洲系列| 亚洲免费资源在线播放| 色婷婷综合在线| 亚洲制服欧美中文字幕中文字幕| 91免费在线看| 中文字幕一区二区三区色视频| 国产成人在线视频网站| 中文字幕欧美国产| 成人午夜私人影院| 中文字幕一区二区不卡| 97精品久久久午夜一区二区三区 | 5566中文字幕一区二区电影|