예제 #1
0
int selinux_raw_to_trans_context(const security_context_t raw,
				 security_context_t * transp)
{
	if (!raw) {
		*transp = NULL;
		return 0;
	}

	__selinux_once(once, init_context_translations);

	if (!mls_enabled) {
		*transp = strdup(raw);
		goto out;
	}

	if (prev_r2t_raw && strcmp(prev_r2t_raw, raw) == 0) {
		*transp = strdup(prev_r2t_trans);
	} else {
		free(prev_r2t_raw);
		prev_r2t_raw = NULL;
		free(prev_r2t_trans);
		prev_r2t_trans = NULL;
		if (raw_to_trans_context(raw, transp))
			*transp = strdup(raw);
		if (*transp) {
			prev_r2t_raw = strdup(raw);
			if (!prev_r2t_raw)
				goto out;
			prev_r2t_trans = strdup(*transp);
			if (!prev_r2t_trans) {
				free(prev_r2t_raw);
				prev_r2t_raw = NULL;
			}
		}
	}
      out:
	return *transp ? 0 : -1;
}
예제 #2
0
int security_compute_relabel(security_context_t scon,
                             security_context_t tcon,
                             security_class_t tclass,
                             security_context_t *newcon)
{
	int ret;
	security_context_t rscon = scon;
	security_context_t rtcon = tcon;
	security_context_t rnewcon;

	if (context_translations) {
		if (trans_to_raw_context(scon, &rscon))
			return -1;
		if (trans_to_raw_context(tcon, &rtcon)) {
			freecon(rscon);
			return -1;
		}
	}

 	ret = security_compute_relabel_raw(rscon, rtcon, tclass, &rnewcon);

	if (context_translations) {
		freecon(rscon);
		freecon(rtcon);
		if (!ret) {
			if (raw_to_trans_context(rnewcon, newcon)) {
				*newcon = NULL;
				ret = -1;
			}
			freecon(rnewcon);
		}
	} else if (!ret)
		*newcon = rnewcon;

	return ret;
}