Source Joachim Nilsson:
Collect forked off children from M-| command
Mg left zombies from commands executed when piping a region of text to
an external command. This patch makes sure to collect for the child
before returning.
Looks ok to me. ok?
Index: region.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/region.c,v
retrieving revision 1.35
diff -u -p -u -p -r1.35 region.c
--- region.c 19 Mar 2015 21:22:15 -0000 1.35
+++ region.c 7 Sep 2016 11:58:55 -0000
@@ -12,6 +12,7 @@
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
@@ -515,8 +516,9 @@ int
pipeio(const char* const path, char* const argv[], char* const text, int len,
struct buffer *outbp)
{
- int s[2];
+ int s[2], ret;
char *err;
+ pid_t pid;
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, s) == -1) {
dobeep();
@@ -524,7 +526,7 @@ pipeio(const char* const path, char* con
return (FALSE);
}
- switch(fork()) {
+ switch((pid = fork())) {
case -1:
dobeep();
ewprintf("Can't fork");
@@ -548,7 +550,10 @@ pipeio(const char* const path, char* con
default:
/* Parent process */
close(s[1]);
- return (iomux(s[0], text, len, outbp));
+ ret = iomux(s[0], text, len, outbp);
+ waitpid(pid, NULL, 0); /* Collect child to prevent zombies */
+
+ return (ret);
}
return (FALSE);
}