int security_compute_relabel(const char * scon, const char * tcon, security_class_t tclass, char ** newcon) { int ret; char * rscon; char * rtcon; char * rnewcon; if (selinux_trans_to_raw_context(scon, &rscon)) return -1; if (selinux_trans_to_raw_context(tcon, &rtcon)) { freecon(rscon); return -1; } ret = security_compute_relabel_raw(rscon, rtcon, tclass, &rnewcon); freecon(rscon); freecon(rtcon); if (!ret) { ret = selinux_raw_to_trans_context(rnewcon, newcon); freecon(rnewcon); } return ret; }
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; }