提交 9674f2c6 编写于 作者: M Martin Kletzander

selinux: Use raw contexts

We are currently able to work only with non-translated SELinux
contexts, but we are using functions that work with translated
contexts throughout the code.  This patch swaps all SELinux context
translation relative calls with their raw sisters to avoid parsing
problems.

The problems can be experienced with mcstrans for example.  The
difference is that if you have translations enabled (yum install
mcstrans; service mcstrans start), fgetfilecon_raw() will get you
something like 'system_u:object_r:virt_image_t:s0', whereas
fgetfilecon() will return 'system_u:object_r:virt_image_t:SystemLow'
that we cannot parse.

I was trying to confirm that the _raw variants were here since the dawn of
time, but the only thing I see now is that it was imported together in
the upstream repo [1] from svn, so before 2008.

Thanks Laurent Bigonville for finding this out.

[1] http://oss.tresys.com/git/selinux.git
上级 f95560b3
...@@ -1440,14 +1440,14 @@ if test "$with_selinux" != "no"; then ...@@ -1440,14 +1440,14 @@ if test "$with_selinux" != "no"; then
old_libs="$LIBS" old_libs="$LIBS"
if test "$with_selinux" = "check"; then if test "$with_selinux" = "check"; then
AC_CHECK_HEADER([selinux/selinux.h],[],[with_selinux=no]) AC_CHECK_HEADER([selinux/selinux.h],[],[with_selinux=no])
AC_CHECK_LIB([selinux], [fgetfilecon],[],[with_selinux=no]) AC_CHECK_LIB([selinux], [fgetfilecon_raw],[],[with_selinux=no])
if test "$with_selinux" != "no"; then if test "$with_selinux" != "no"; then
with_selinux="yes" with_selinux="yes"
fi fi
else else
fail=0 fail=0
AC_CHECK_HEADER([selinux/selinux.h],[],[fail=1]) AC_CHECK_HEADER([selinux/selinux.h],[],[fail=1])
AC_CHECK_LIB([selinux], [fgetfilecon],[],[fail=1]) AC_CHECK_LIB([selinux], [fgetfilecon_raw],[],[fail=1])
test $fail = 1 && test $fail = 1 &&
AC_MSG_ERROR([You must install the libselinux development package in order to compile libvirt with basic SELinux support]) AC_MSG_ERROR([You must install the libselinux development package in order to compile libvirt with basic SELinux support])
fi fi
......
...@@ -111,7 +111,7 @@ virSecuritySELinuxMCSFind(virSecurityManagerPtr mgr) ...@@ -111,7 +111,7 @@ virSecuritySELinuxMCSFind(virSecurityManagerPtr mgr)
char *sens, *cat, *tmp; char *sens, *cat, *tmp;
int catMin, catMax, catRange; int catMin, catMax, catRange;
if (getcon(&ourSecContext) < 0) { if (getcon_raw(&ourSecContext) < 0) {
virReportSystemError(errno, "%s", virReportSystemError(errno, "%s",
_("Unable to get current process SELinux context")); _("Unable to get current process SELinux context"));
goto cleanup; goto cleanup;
...@@ -252,7 +252,7 @@ virSecuritySELinuxGenNewContext(const char *basecontext, ...@@ -252,7 +252,7 @@ virSecuritySELinuxGenNewContext(const char *basecontext,
VIR_DEBUG("basecontext=%s mcs=%s isObjectContext=%d", VIR_DEBUG("basecontext=%s mcs=%s isObjectContext=%d",
basecontext, mcs, isObjectContext); basecontext, mcs, isObjectContext);
if (getcon(&ourSecContext) < 0) { if (getcon_raw(&ourSecContext) < 0) {
virReportSystemError(errno, "%s", virReportSystemError(errno, "%s",
_("Unable to get current process SELinux context")); _("Unable to get current process SELinux context"));
goto cleanup; goto cleanup;
...@@ -612,7 +612,7 @@ virSecuritySELinuxReserveSecurityLabel(virSecurityManagerPtr mgr, ...@@ -612,7 +612,7 @@ virSecuritySELinuxReserveSecurityLabel(virSecurityManagerPtr mgr,
if (seclabel->type == VIR_DOMAIN_SECLABEL_STATIC) if (seclabel->type == VIR_DOMAIN_SECLABEL_STATIC)
return 0; return 0;
if (getpidcon(pid, &pctx) == -1) { if (getpidcon_raw(pid, &pctx) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to get PID %d security context"), pid); _("unable to get PID %d security context"), pid);
return -1; return -1;
...@@ -713,7 +713,7 @@ virSecuritySELinuxGetSecurityProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN ...@@ -713,7 +713,7 @@ virSecuritySELinuxGetSecurityProcessLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN
{ {
security_context_t ctx; security_context_t ctx;
if (getpidcon(pid, &ctx) == -1) { if (getpidcon_raw(pid, &ctx) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to get PID %d security context"), _("unable to get PID %d security context"),
pid); pid);
...@@ -753,10 +753,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon, bool optional) ...@@ -753,10 +753,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon, bool optional)
VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon); VIR_INFO("Setting SELinux context on '%s' to '%s'", path, tcon);
if (setfilecon(path, tcon) < 0) { if (setfilecon_raw(path, tcon) < 0) {
int setfilecon_errno = errno; int setfilecon_errno = errno;
if (getfilecon(path, &econ) >= 0) { if (getfilecon_raw(path, &econ) >= 0) {
if (STREQ(tcon, econ)) { if (STREQ(tcon, econ)) {
freecon(econ); freecon(econ);
/* It's alright, there's nothing to change anyway. */ /* It's alright, there's nothing to change anyway. */
...@@ -818,10 +818,10 @@ virSecuritySELinuxFSetFilecon(int fd, char *tcon) ...@@ -818,10 +818,10 @@ virSecuritySELinuxFSetFilecon(int fd, char *tcon)
VIR_INFO("Setting SELinux context on fd %d to '%s'", fd, tcon); VIR_INFO("Setting SELinux context on fd %d to '%s'", fd, tcon);
if (fsetfilecon(fd, tcon) < 0) { if (fsetfilecon_raw(fd, tcon) < 0) {
int fsetfilecon_errno = errno; int fsetfilecon_errno = errno;
if (fgetfilecon(fd, &econ) >= 0) { if (fgetfilecon_raw(fd, &econ) >= 0) {
if (STREQ(tcon, econ)) { if (STREQ(tcon, econ)) {
freecon(econ); freecon(econ);
/* It's alright, there's nothing to change anyway. */ /* It's alright, there's nothing to change anyway. */
...@@ -1577,7 +1577,7 @@ virSecuritySELinuxSetSecurityProcessLabel(virSecurityManagerPtr mgr, ...@@ -1577,7 +1577,7 @@ virSecuritySELinuxSetSecurityProcessLabel(virSecurityManagerPtr mgr,
return -1; return -1;
} }
if (setexeccon(secdef->label) == -1) { if (setexeccon_raw(secdef->label) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to set security context '%s'"), _("unable to set security context '%s'"),
secdef->label); secdef->label);
...@@ -1622,7 +1622,7 @@ virSecuritySELinuxSetSecurityDaemonSocketLabel(virSecurityManagerPtr mgr, ...@@ -1622,7 +1622,7 @@ virSecuritySELinuxSetSecurityDaemonSocketLabel(virSecurityManagerPtr mgr,
goto done; goto done;
} }
if (getcon(&scon) == -1) { if (getcon_raw(&scon) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to get current process context '%s'"), _("unable to get current process context '%s'"),
secdef->label); secdef->label);
...@@ -1645,7 +1645,7 @@ virSecuritySELinuxSetSecurityDaemonSocketLabel(virSecurityManagerPtr mgr, ...@@ -1645,7 +1645,7 @@ virSecuritySELinuxSetSecurityDaemonSocketLabel(virSecurityManagerPtr mgr,
VIR_DEBUG("Setting VM %s socket context %s", VIR_DEBUG("Setting VM %s socket context %s",
def->name, context_str(proccon)); def->name, context_str(proccon));
if (setsockcreatecon(context_str(proccon)) == -1) { if (setsockcreatecon_raw(context_str(proccon)) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to set socket security context '%s'"), _("unable to set socket security context '%s'"),
context_str(proccon)); context_str(proccon));
...@@ -1688,7 +1688,7 @@ virSecuritySELinuxSetSecuritySocketLabel(virSecurityManagerPtr mgr, ...@@ -1688,7 +1688,7 @@ virSecuritySELinuxSetSecuritySocketLabel(virSecurityManagerPtr mgr,
VIR_DEBUG("Setting VM %s socket context %s", VIR_DEBUG("Setting VM %s socket context %s",
vm->name, secdef->label); vm->name, secdef->label);
if (setsockcreatecon(secdef->label) == -1) { if (setsockcreatecon_raw(secdef->label) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to set socket security context '%s'"), _("unable to set socket security context '%s'"),
secdef->label); secdef->label);
...@@ -1728,7 +1728,7 @@ virSecuritySELinuxClearSecuritySocketLabel(virSecurityManagerPtr mgr, ...@@ -1728,7 +1728,7 @@ virSecuritySELinuxClearSecuritySocketLabel(virSecurityManagerPtr mgr,
return -1; return -1;
} }
if (setsockcreatecon(NULL) == -1) { if (setsockcreatecon_raw(NULL) == -1) {
virReportSystemError(errno, virReportSystemError(errno,
_("unable to clear socket security context '%s'"), _("unable to clear socket security context '%s'"),
secdef->label); secdef->label);
......
...@@ -1227,7 +1227,7 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr target, ...@@ -1227,7 +1227,7 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr target,
#if HAVE_SELINUX #if HAVE_SELINUX
/* XXX: make this a security driver call */ /* XXX: make this a security driver call */
if (fgetfilecon(fd, &filecon) == -1) { if (fgetfilecon_raw(fd, &filecon) == -1) {
if (errno != ENODATA && errno != ENOTSUP) { if (errno != ENODATA && errno != ENOTSUP) {
virReportSystemError(errno, virReportSystemError(errno,
_("cannot get file context of '%s'"), _("cannot get file context of '%s'"),
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
* the process context, where as in fact we're faking it all * the process context, where as in fact we're faking it all
*/ */
int getcon(security_context_t *context) int getcon_raw(security_context_t *context)
{ {
if (getenv("FAKE_CONTEXT") == NULL) { if (getenv("FAKE_CONTEXT") == NULL) {
*context = NULL; *context = NULL;
...@@ -43,7 +43,7 @@ int getcon(security_context_t *context) ...@@ -43,7 +43,7 @@ int getcon(security_context_t *context)
return 0; return 0;
} }
int getpidcon(pid_t pid, security_context_t *context) int getpidcon_raw(pid_t pid, security_context_t *context)
{ {
if (pid != getpid()) { if (pid != getpid()) {
*context = NULL; *context = NULL;
...@@ -60,7 +60,7 @@ int getpidcon(pid_t pid, security_context_t *context) ...@@ -60,7 +60,7 @@ int getpidcon(pid_t pid, security_context_t *context)
return 0; return 0;
} }
int setcon(security_context_t context) int setcon_raw(security_context_t context)
{ {
return setenv("FAKE_CONTEXT", context, 1); return setenv("FAKE_CONTEXT", context, 1);
} }
...@@ -217,7 +217,7 @@ testSELinuxGenLabel(const void *opaque) ...@@ -217,7 +217,7 @@ testSELinuxGenLabel(const void *opaque)
context_t con = NULL; context_t con = NULL;
context_t imgcon = NULL; context_t imgcon = NULL;
if (setcon((security_context_t)data->pidcon) < 0) { if (setcon_raw((security_context_t)data->pidcon) < 0) {
perror("Cannot set process security context"); perror("Cannot set process security context");
return -1; return -1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册