From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4773 invoked by alias); 2 Feb 2017 08:06:38 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 40485 Received: (qmail 3627 invoked from network); 2 Feb 2017 08:06:38 -0000 X-Qmail-Scanner-Diagnostics: from mail-pg0-f67.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(74.125.83.67):SA:0(-0.0/5.0):. Processed in 0.587476 secs); 02 Feb 2017 08:06:38 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: ericdfreese@gmail.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _netblocks.google.com designates 74.125.83.67 as permitted sender) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=bXB2RB7xINzapo5E3TT+nCAPJxetfveOALjtYrtd4vs=; b=fI/+oMQCGRWPD4M1KXJJ1AmAIej4UTnEGjgoGNnq2PGq45WcseRcRuv43zynNUBh3F mMEg5rzsPXFTqraLqsSZ1+70aQSBGKblH9k5c6yfamwm7cltu/FvaH33hnleu2vebgIQ D0wpfNf4RiT9BP8Emc6dt+d/Qfa2eznQ2PQVQSwtvlHmUU2clVy49KVhY/nkD85lY7N8 6elagdcs7nsH76sAdQFtqFirWG4mocplYrkNZgcf50bz4aYtHenWG6lNtKShTtSiC0aE SmJwbqoeNXupoXTV3MNmIRPukOxtrJEfSMqZmDIHvXtEIEuBdMFRsvWEgD1otVEGiXnZ S/Xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=bXB2RB7xINzapo5E3TT+nCAPJxetfveOALjtYrtd4vs=; b=UoWzDUrzeRTVJOKZ/N3myMRsIBnt7A5Q5jQ6SCE94xIi7h4CtJ6p8kO9LIaLhbiINL cYYi97tLORX1cmbicQcMmmPz+8JgzmRDClzq55mTlOCJou3ZzvTKNa8cp5qSBU3wIBeT REXgtynVu15VTO1dbxN+n8sDPr+5IHqxUpbwjxWFImnCulSSG9SEWY07avIxEn3Unc7P FVQRUSYPsLJY/vR5Qkmg2UKTjnWrSQFPxBfarzpmJQB3K3afH08QeEa84qNcmPob+jkD 3sk77KCe2eJA1mlB6JOqhaN2C2ae9QnzSw9eCrXiBLEVcEWXRPfjBf6vGwHd7VviVywX uagw== X-Gm-Message-State: AIkVDXK+QtVqTJC7V2JwS/y6ofsilx+G/HMDE1kWw0tMid2HcsILzGX2wjyaealAcvI1cA== X-Received: by 10.99.138.201 with SMTP id y192mr1532616pgd.146.1485929544055; Tue, 31 Jan 2017 22:12:24 -0800 (PST) From: Eric Freese To: zsh-workers@zsh.org Cc: Eric Freese Subject: [PATCH] Remove zpty exit hook from forked processes Date: Tue, 31 Jan 2017 23:12:02 -0700 Message-Id: <20170201061202.47726-1-ericdfreese@gmail.com> X-Mailer: git-send-email 2.9.0 Fixes a bug where `zpty -d foo` kills `foo` and all pty commands started before `foo`. Steps to reproduce before the patch: % zmodload zsh/zpty % zpty -b foo cat % zpty -b bar cat % zpty -b baz cat % zpty -d bar % zpty -t foo; echo $? 1 % zpty -t bar; echo $? zpty: no such pty command: bar 1 % zpty -t baz; echo $? 0 Results after the patch (note the exit code of `zpty -t foo`): % zmodload zsh/zpty % zpty -b foo cat % zpty -b bar cat % zpty -b baz cat % zpty -d bar % zpty -t foo; echo $? 0 % zpty -t bar; echo $? zpty: no such pty command: bar 1 % zpty -t baz; echo $? 0 --- Src/Modules/zpty.c | 91 +++++++++++++++++++++++++++--------------------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 2c87be1..fbc1a88 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -294,6 +294,51 @@ get_pty(int master, int *retfd) #endif /* /dev/ptmx or alternatives */ +static void +deleteptycmd(Ptycmd cmd) +{ + Ptycmd p, q; + + for (q = NULL, p = ptycmds; p != cmd; q = p, p = p->next); + + if (p != cmd) + return; + + if (q) + q->next = p->next; + else + ptycmds = p->next; + + zsfree(p->name); + freearray(p->args); + + zclose(cmd->fd); + + /* We kill the process group the command put itself in. */ + + kill(-(p->pid), SIGHUP); + + zfree(p, sizeof(*p)); +} + +static void +deleteallptycmds(void) +{ + Ptycmd p, n; + + for (p = ptycmds; p; p = n) { + n = p->next; + deleteptycmd(p); + } +} + +static int +ptyhook(UNUSED(Hookdef d), UNUSED(void *dummy)) +{ + deleteallptycmds(); + return 0; +} + static int newptycmd(char *nam, char *pname, char **args, int echo, int nblock) { @@ -331,6 +376,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) /* This code copied from the clone module, except for getting * * the descriptor from get_pty() and duplicating it to 0/1/2. */ + deletehookfunc("exit", ptyhook); clearjobtab(0); ppid = getppid(); mypid = getpid(); @@ -469,44 +515,6 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) return 0; } -static void -deleteptycmd(Ptycmd cmd) -{ - Ptycmd p, q; - - for (q = NULL, p = ptycmds; p != cmd; q = p, p = p->next); - - if (p != cmd) - return; - - if (q) - q->next = p->next; - else - ptycmds = p->next; - - zsfree(p->name); - freearray(p->args); - - zclose(cmd->fd); - - /* We kill the process group the command put itself in. */ - - kill(-(p->pid), SIGHUP); - - zfree(p, sizeof(*p)); -} - -static void -deleteallptycmds(void) -{ - Ptycmd p, n; - - for (p = ptycmds; p; p = n) { - n = p->next; - deleteptycmd(p); - } -} - /**** a better process handling would be nice */ static void @@ -852,13 +860,6 @@ bin_zpty(char *nam, char **args, Options ops, UNUSED(int func)) } } -static int -ptyhook(UNUSED(Hookdef d), UNUSED(void *dummy)) -{ - deleteallptycmds(); - return 0; -} - static struct builtin bintab[] = { BUILTIN("zpty", 0, bin_zpty, 0, -1, 0, "ebdmrwLnt", NULL), -- 2.9.0