summaryrefslogtreecommitdiff
path: root/util-linux/unshare.c
diff options
context:
space:
mode:
authorDenys Vlasenko2016-04-02 18:06:24 +0200
committerDenys Vlasenko2016-04-02 18:06:24 +0200
commit8220399173cf8d25e37059cadac96ac30f94e82a (patch)
treeffe5ae4a783c8ddeceda15f57eae74ee69feebea /util-linux/unshare.c
parentc87e81f9440278dd46a3eddd1e0f4773afd46a95 (diff)
downloadbusybox-8220399173cf8d25e37059cadac96ac30f94e82a.zip
busybox-8220399173cf8d25e37059cadac96ac30f94e82a.tar.gz
nsenter,unshare: share common code; fix a bug of not closing all fds
function old new delta xvfork_parent_waits_and_exits - 64 +64 exec_prog_or_SHELL - 39 +39 unshare_main 873 810 -63 nsenter_main 663 596 -67 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 0/2 up/down: 106/-130) Total: -27 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux/unshare.c')
-rw-r--r--util-linux/unshare.c19
1 files changed, 3 insertions, 16 deletions
diff --git a/util-linux/unshare.c b/util-linux/unshare.c
index 2a5bea5..95a7cb6 100644
--- a/util-linux/unshare.c
+++ b/util-linux/unshare.c
@@ -281,7 +281,7 @@ int unshare_main(int argc UNUSED_PARAM, char **argv)
if (fdp.wr >= 0) {
close(fdp.wr); /* Release child */
- /*close(fdp.rd);*/
+ close(fdp.rd); /* should close fd, to not confuse exec'ed PROG */
}
if (need_mount) {
@@ -307,14 +307,7 @@ int unshare_main(int argc UNUSED_PARAM, char **argv)
* that'll become PID 1 in this new namespace.
*/
if (opts & OPT_fork) {
- pid_t pid = xfork();
- if (pid > 0) {
- /* Parent */
- int exit_status = wait_for_exitstatus(pid);
- if (WIFSIGNALED(exit_status))
- kill_myself_with_sig(WTERMSIG(exit_status));
- return WEXITSTATUS(exit_status);
- }
+ xvfork_parent_waits_and_exits();
/* Child continues */
}
@@ -354,11 +347,5 @@ int unshare_main(int argc UNUSED_PARAM, char **argv)
mount_or_die("proc", proc_mnt_target, "proc", MS_NOSUID | MS_NOEXEC | MS_NODEV);
}
- if (argv[0]) {
- BB_EXECVP_or_die(argv);
- }
- /* unshare from util-linux 2.27.1, despite not documenting it,
- * runs a login shell (argv0="-sh") if no PROG is given
- */
- run_shell(getenv("SHELL"), /*login:*/ 1, NULL, NULL);
+ exec_prog_or_SHELL(argv);
}