Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Bug in interaction with pid namespaces
- X-seq: zsh-workers 33982
- From: Chirantan Ekbote <chirantan@xxxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: Bug in interaction with pid namespaces
- Date: Tue, 16 Dec 2014 15:07:28 -0800
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=wrYqQi/s74IwXTbwNQUG/O+qdWVSH51/x/+tVcJ71bc=; b=oZY9ObWTADyti9oyO1erKleVUe28PSti0FtyUJPn6Nun9mNMyyh5ucMBK1uYysRrD2 1RTeLDO3uDT7RciasXe5tDF4atdVtbksH82IQbNr8l7LuJuAibPLBjEhN0GkEr6eoDfl z+1oH0H8uwS2yvbh4Bi1QoEoSSTLSNZmA8l9DguK2Xp68q9L4XZOCQlPoc72XIIYihSG 9UVCEVOby13I5MUQtHsOyGr+MeDs+Hik//FTK5W8nd5tuqaRNDjUCkXA10vOqujB2awL OmJ+5eUqVRx91BU8H58gRXH/s2cYWisTniZ3luj0dJcYkPEHvSoTNPXQEVbEcvHLrDEB d6Qg==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Hi,
I think I've found an issue with the way zsh interacts with pid namespaces [1].
Specifically the problem is that when zsh is launched immediately following the
creation of a new pid namespace it doesn't take ownership of the process group,
causing things like SIGINT to be sent to the process that spawned zsh rather
than zsh itself. This can be minimally reproduced by running:
unshare -p -f --mount-proc zsh -l
and then running
ps o pid,pgid,comm
inside the newly created shell. The expected result is that the pgid for zsh
should be the same as its pid, indicating that zsh has become the leader of a
new process group. Instead I see that zsh has pgid 0 and a different pid
(usually 1). If you then press ctrl-c, zsh will exit rather than just show the
prompt again. I think this can be fixed with the following patch:
diff --git a/Src/jobs.c b/Src/jobs.c
index a668b07..8c4254a 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -2734,7 +2734,7 @@ acquire_pgrp(void)
long ttpgrp;
sigset_t blockset, oldset;
- if ((mypgrp = GETPGRP()) > 0) {
+ if ((mypgrp = GETPGRP()) >= 0) {
long lastpgrp = mypgrp;
sigemptyset(&blockset);
sigaddset(&blockset, SIGTTIN);
but this brings up another problem. When zsh exits it tries to restore the
original process group using setpgrp(0, origpgrp). This is an issue when
origpgrp is 0 because setpgrp(0, 0) actually means "set the process group of the
calling process to be the same as its pid", which is not the intention of the
call at all.
What's the proper way to fix this?
Thanks,
Chirantan
[1] http://lwn.net/Articles/531419/
Messages sorted by:
Reverse Date,
Date,
Thread,
Author