⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mls.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (newcontext->type != tcontext->type) {			/* Use the process MLS attributes. */			return mls_copy_context(newcontext, scontext);		} else {			/* Use the related object MLS attributes. */			return mls_copy_context(newcontext, tcontext);		}	default:		return -EINVAL;	}	return -EINVAL;}void mls_user_destroy(struct user_datum *usrdatum){	struct mls_range_list *rnode, *rtmp;	rnode = usrdatum->ranges;	while (rnode) {		rtmp = rnode;		rnode = rnode->next;		ebitmap_destroy(&rtmp->range.level[0].cat);		ebitmap_destroy(&rtmp->range.level[1].cat);		kfree(rtmp);	}}int mls_read_perm(struct perm_datum *perdatum, void *fp){	u32 buf[1];	int rc;	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0)		return -EINVAL;	perdatum->base_perms = le32_to_cpu(buf[0]);	return 0;}/* * Read a MLS level structure from a policydb binary * representation file. */struct mls_level *mls_read_level(void *fp){	struct mls_level *l;	u32 buf[1];	int rc;	l = kmalloc(sizeof(*l), GFP_ATOMIC);	if (!l) {		printk(KERN_ERR "security: mls: out of memory\n");		return NULL;	}	memset(l, 0, sizeof(*l));	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0) {		printk(KERN_ERR "security: mls: truncated level\n");		goto bad;	}	l->sens = cpu_to_le32(buf[0]);	if (ebitmap_read(&l->cat, fp)) {		printk(KERN_ERR "security: mls:  error reading level "		       "categories\n");		goto bad;	}	return l;bad:	kfree(l);	return NULL;}/* * Read a MLS range structure from a policydb binary * representation file. */static int mls_read_range_helper(struct mls_range *r, void *fp){	u32 buf[2], items;	int rc;	rc = next_entry(buf, fp, sizeof(u32));	if (rc < 0)		goto out;	items = le32_to_cpu(buf[0]);	if (items > ARRAY_SIZE(buf)) {		printk(KERN_ERR "security: mls:  range overflow\n");		rc = -EINVAL;		goto out;	}	rc = next_entry(buf, fp, sizeof(u32) * items);	if (rc < 0) {		printk(KERN_ERR "security: mls:  truncated range\n");		goto out;	}	r->level[0].sens = le32_to_cpu(buf[0]);	if (items > 1) {		r->level[1].sens = le32_to_cpu(buf[1]);	} else {		r->level[1].sens = r->level[0].sens;	}	rc = ebitmap_read(&r->level[0].cat, fp);	if (rc) {		printk(KERN_ERR "security: mls:  error reading low "		       "categories\n");		goto out;	}	if (items > 1) {		rc = ebitmap_read(&r->level[1].cat, fp);		if (rc) {			printk(KERN_ERR "security: mls:  error reading high "			       "categories\n");			goto bad_high;		}	} else {		rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat);		if (rc) {			printk(KERN_ERR "security: mls:  out of memory\n");			goto bad_high;		}	}	rc = 0;out:	return rc;bad_high:	ebitmap_destroy(&r->level[0].cat);	goto out;}int mls_read_range(struct context *c, void *fp){	return mls_read_range_helper(&c->range, fp);}/* * Read a MLS perms structure from a policydb binary * representation file. */int mls_read_class(struct class_datum *cladatum, void *fp){	struct mls_perms *p = &cladatum->mlsperms;	u32 buf[4];	int rc;	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0) {		printk(KERN_ERR "security: mls:  truncated mls permissions\n");		return -EINVAL;	}	p->read = le32_to_cpu(buf[0]);	p->readby = le32_to_cpu(buf[1]);	p->write = le32_to_cpu(buf[2]);	p->writeby = le32_to_cpu(buf[3]);	return 0;}int mls_read_user(struct user_datum *usrdatum, void *fp){	struct mls_range_list *r, *l;	int rc;	u32 nel, i;	u32 buf[1];	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0)		goto out;	nel = le32_to_cpu(buf[0]);	l = NULL;	for (i = 0; i < nel; i++) {		r = kmalloc(sizeof(*r), GFP_ATOMIC);		if (!r) {			rc = -ENOMEM;			goto out;		}		memset(r, 0, sizeof(*r));		rc = mls_read_range_helper(&r->range, fp);		if (rc) {			kfree(r);			goto out;		}		if (l)			l->next = r;		else			usrdatum->ranges = r;		l = r;	}out:	return rc;}int mls_read_nlevels(struct policydb *p, void *fp){	u32 buf[1];	int rc;	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0)		return -EINVAL;	p->nlevels = le32_to_cpu(buf[0]);	return 0;}int mls_read_trusted(struct policydb *p, void *fp){	int rc = 0;	rc = ebitmap_read(&p->trustedreaders, fp);	if (rc)		goto out;	rc = ebitmap_read(&p->trustedwriters, fp);	if (rc)		goto bad;	rc = ebitmap_read(&p->trustedobjects, fp);	if (rc)		goto bad2;out:	return rc;bad2:	ebitmap_destroy(&p->trustedwriters);bad:	ebitmap_destroy(&p->trustedreaders);	goto out;}int sens_index(void *key, void *datum, void *datap){	struct policydb *p;	struct level_datum *levdatum;	levdatum = datum;	p = datap;	if (!levdatum->isalias)		p->p_sens_val_to_name[levdatum->level->sens - 1] = key;	return 0;}int cat_index(void *key, void *datum, void *datap){	struct policydb *p;	struct cat_datum *catdatum;	catdatum = datum;	p = datap;	if (!catdatum->isalias)		p->p_cat_val_to_name[catdatum->value - 1] = key;	return 0;}int sens_destroy(void *key, void *datum, void *p){	struct level_datum *levdatum;	kfree(key);	levdatum = datum;	if (!levdatum->isalias) {		ebitmap_destroy(&levdatum->level->cat);		kfree(levdatum->level);	}	kfree(datum);	return 0;}int cat_destroy(void *key, void *datum, void *p){	kfree(key);	kfree(datum);	return 0;}int sens_read(struct policydb *p, struct hashtab *h, void *fp){	char *key = NULL;	struct level_datum *levdatum;	int rc;	u32 buf[2], len;	levdatum = kmalloc(sizeof(*levdatum), GFP_ATOMIC);	if (!levdatum) {		rc = -ENOMEM;		goto out;	}	memset(levdatum, 0, sizeof(*levdatum));	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0)		goto bad;	len = le32_to_cpu(buf[0]);	levdatum->isalias = le32_to_cpu(buf[1]);	key = kmalloc(len + 1,GFP_ATOMIC);	if (!key) {		rc = -ENOMEM;		goto bad;	}	rc = next_entry(key, fp, len);	if (rc < 0)		goto bad;	key[len] = 0;	levdatum->level = mls_read_level(fp);	if (!levdatum->level) {		rc = -EINVAL;		goto bad;	}	rc = hashtab_insert(h, key, levdatum);	if (rc)		goto bad;out:	return rc;bad:	sens_destroy(key, levdatum, NULL);	goto out;}int cat_read(struct policydb *p, struct hashtab *h, void *fp){	char *key = NULL;	struct cat_datum *catdatum;	int rc;	u32 buf[3], len;	catdatum = kmalloc(sizeof(*catdatum), GFP_ATOMIC);	if (!catdatum) {		rc = -ENOMEM;		goto out;	}	memset(catdatum, 0, sizeof(*catdatum));	rc = next_entry(buf, fp, sizeof buf);	if (rc < 0)		goto bad;	len = le32_to_cpu(buf[0]);	catdatum->value = le32_to_cpu(buf[1]);	catdatum->isalias = le32_to_cpu(buf[2]);	key = kmalloc(len + 1,GFP_ATOMIC);	if (!key) {		rc = -ENOMEM;		goto bad;	}	rc = next_entry(key, fp, len);	if (rc < 0)		goto bad;	key[len] = 0;	rc = hashtab_insert(h, key, catdatum);	if (rc)		goto bad;out:	return rc;bad:	cat_destroy(key, catdatum, NULL);	goto out;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -