d2bdca
diff -up util-linux-2.23.2/sys-utils/Makemodule.am.kzak util-linux-2.23.2/sys-utils/Makemodule.am
d2bdca
--- util-linux-2.23.2/sys-utils/Makemodule.am.kzak	2015-06-26 10:21:34.337221288 +0200
d2bdca
+++ util-linux-2.23.2/sys-utils/Makemodule.am	2015-06-26 10:22:18.719885983 +0200
d2bdca
@@ -308,7 +308,7 @@ if BUILD_NSENTER
d2bdca
 usrbin_exec_PROGRAMS += nsenter
d2bdca
 dist_man_MANS += sys-utils/nsenter.1
d2bdca
 nsenter_SOURCES = sys-utils/nsenter.c
d2bdca
-nsenter_LDADD = $(LDADD) libcommon.la
d2bdca
+nsenter_LDADD = $(LDADD) libcommon.la $(SELINUX_LIBS)
d2bdca
 endif
d2bdca
 
d2bdca
 if BUILD_HWCLOCK
d2bdca
diff -up util-linux-2.23.2/sys-utils/nsenter.1.kzak util-linux-2.23.2/sys-utils/nsenter.1
d2bdca
--- util-linux-2.23.2/sys-utils/nsenter.1.kzak	2015-06-26 10:14:00.947646586 +0200
d2bdca
+++ util-linux-2.23.2/sys-utils/nsenter.1	2015-06-26 10:21:34.337221288 +0200
d2bdca
@@ -155,6 +155,11 @@ Do not fork before exec'ing the specifie
d2bdca
 PID namespace, \fBnsenter\fP calls \fBfork\fP before calling \fBexec\fP so that
d2bdca
 any children will also be in the newly entered PID namespace.
d2bdca
 .TP
d2bdca
+\fB\-Z\fR, \fB\-\-follow\-context\fR
d2bdca
+Set the SELinux security context used for executing a new process according to
d2bdca
+already running process specified by \fB\-\-target\fR PID. (The util-linux has
d2bdca
+to be compiled with SELinux support otherwise the option is unavailable.)
d2bdca
+.TP
d2bdca
 \fB\-V\fR, \fB\-\-version\fR
d2bdca
 Display version information and exit.
d2bdca
 .TP
d2bdca
@@ -163,10 +168,14 @@ Display help text and exit.
d2bdca
 .SH SEE ALSO
d2bdca
 .BR setns (2),
d2bdca
 .BR clone (2)
d2bdca
-.SH AUTHOR
d2bdca
-.MT ebiederm@xmission.com
d2bdca
+.SH AUTHORS
d2bdca
+.UR biederm@xmission.com
d2bdca
 Eric Biederman
d2bdca
-.ME
d2bdca
+.UE
d2bdca
+.br
d2bdca
+.UR kzak@redhat.com
d2bdca
+Karel Zak
d2bdca
+.UE
d2bdca
 .SH AVAILABILITY
d2bdca
 The nsenter command is part of the util-linux package and is available from
d2bdca
 .UR ftp://\:ftp.kernel.org\:/pub\:/linux\:/utils\:/util-linux/
d2bdca
diff -up util-linux-2.23.2/sys-utils/nsenter.c.kzak util-linux-2.23.2/sys-utils/nsenter.c
d2bdca
--- util-linux-2.23.2/sys-utils/nsenter.c.kzak	2015-06-26 10:14:00.947646586 +0200
d2bdca
+++ util-linux-2.23.2/sys-utils/nsenter.c	2015-06-26 10:21:34.337221288 +0200
d2bdca
@@ -30,6 +30,10 @@
d2bdca
 #include <sys/wait.h>
d2bdca
 #include <grp.h>
d2bdca
 
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+# include <selinux/selinux.h>
d2bdca
+#endif
d2bdca
+
d2bdca
 #include "strutils.h"
d2bdca
 #include "nls.h"
d2bdca
 #include "c.h"
d2bdca
@@ -82,6 +86,9 @@ static void usage(int status)
d2bdca
 	fputs(_(" -r, --root[=<dir>]     set the root directory\n"), out);
d2bdca
 	fputs(_(" -w, --wd[=<dir>]       set the working directory\n"), out);
d2bdca
 	fputs(_(" -F, --no-fork          do not fork before exec'ing <program>\n"), out);
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+	fputs(_(" -Z, --follow-context   set SELinux context according to --target PID\n"), out);
d2bdca
+#endif
d2bdca
 
d2bdca
 	fputs(USAGE_SEPARATOR, out);
d2bdca
 	fputs(USAGE_HELP, out);
d2bdca
@@ -185,6 +192,9 @@ int main(int argc, char *argv[])
d2bdca
 		{ "wd", optional_argument, NULL, 'w' },
d2bdca
 		{ "no-fork", no_argument, NULL, 'F' },
d2bdca
 		{ "preserve-credentials", no_argument, NULL, OPT_PRESERVE_CRED },
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+		{ "follow-context", no_argument, NULL, 'Z' },
d2bdca
+#endif
d2bdca
 		{ NULL, 0, NULL, 0 }
d2bdca
 	};
d2bdca
 
d2bdca
@@ -194,6 +204,9 @@ int main(int argc, char *argv[])
d2bdca
 	int do_fork = -1; /* unknown yet */
d2bdca
 	uid_t uid = 0;
d2bdca
 	gid_t gid = 0;
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+	bool selinux = 0;
d2bdca
+#endif
d2bdca
 
d2bdca
 	setlocale(LC_ALL, "");
d2bdca
 	bindtextdomain(PACKAGE, LOCALEDIR);
d2bdca
@@ -201,7 +214,7 @@ int main(int argc, char *argv[])
d2bdca
 	atexit(close_stdout);
d2bdca
 
d2bdca
 	while ((c =
d2bdca
-		getopt_long(argc, argv, "+hVt:m::u::i::n::p::U::S:G:r::w::F",
d2bdca
+		getopt_long(argc, argv, "+hVt:m::u::i::n::p::U::S:G:r::w::FZ",
d2bdca
 			    longopts, NULL)) != -1) {
d2bdca
 		switch (c) {
d2bdca
 		case 'h':
d2bdca
@@ -275,11 +288,30 @@ int main(int argc, char *argv[])
d2bdca
 		case OPT_PRESERVE_CRED:
d2bdca
 			preserve_cred = 1;
d2bdca
 			break;
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+		case 'Z':
d2bdca
+			selinux = 1;
d2bdca
+			break;
d2bdca
+#endif
d2bdca
 		default:
d2bdca
 			usage(EXIT_FAILURE);
d2bdca
 		}
d2bdca
 	}
d2bdca
 
d2bdca
+#ifdef HAVE_LIBSELINUX
d2bdca
+	if (selinux && is_selinux_enabled() > 0) {
d2bdca
+		char *scon = NULL;
d2bdca
+
d2bdca
+		if (!namespace_target_pid)
d2bdca
+			errx(EXIT_FAILURE, _("no target PID specified for --follow-context"));
d2bdca
+		if (getpidcon(namespace_target_pid, &scon) < 0)
d2bdca
+			errx(EXIT_FAILURE, _("failed to get %d SELinux context"),
d2bdca
+					(int) namespace_target_pid);
d2bdca
+		if (setexeccon(scon) < 0)
d2bdca
+			errx(EXIT_FAILURE, _("failed to set exec context to '%s'"), scon);
d2bdca
+		freecon(scon);
d2bdca
+	}
d2bdca
+#endif
d2bdca
 	/*
d2bdca
 	 * Open remaining namespace and directory descriptors.
d2bdca
 	 */