X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=spamass-milter.cpp;h=581829358bd8cdeb1f053e0a6ad14a3c30f757d5;hb=b9df85a994d2be845dc3f7c76920fae684c1b606;hp=65657c193021b13020da2e3c69a5cda7935a1f63;hpb=24c75baa57e47c7953cfa22f7cbaee4dbcd2a38c;p=deb_pkgs%2Fspamass-milter.git diff --git a/spamass-milter.cpp b/spamass-milter.cpp index 65657c1..5818293 100644 --- a/spamass-milter.cpp +++ b/spamass-milter.cpp @@ -183,6 +183,7 @@ main(int argc, char* argv[]) bool dofork = false; char *pidfilename = NULL; FILE *pidfile = NULL; + struct sigaction children_sigaction; #ifdef HAVE_VERBOSE_TERMINATE_HANDLER std::set_terminate (__gnu_cxx::__verbose_terminate_handler); @@ -465,13 +466,14 @@ assassinate(SMFICTX* ctx, SpamAssassin* assassin) the only way to do it. */ char *popen_argv[3]; FILE *p; + pid_t pid; popen_argv[0] = SENDMAIL; popen_argv[1] = spambucket; popen_argv[2] = NULL; debug(D_COPY, "calling %s %s", SENDMAIL, spambucket); - p = popenv(popen_argv, "w"); + p = popenv(popen_argv, "w",&pid); if (!p) { debug(D_COPY, "popenv failed(%s). Will not send a copy to spambucket", strerror(errno)); @@ -480,6 +482,7 @@ assassinate(SMFICTX* ctx, SpamAssassin* assassin) // Send message provided by SpamAssassin fwrite(assassin->d().c_str(), assassin->d().size(), 1, p); fclose(p); p = NULL; + waitpid(pid,0,0); } } return SMFIS_REJECT; @@ -826,6 +829,7 @@ mlfi_envrcpt(SMFICTX* ctx, char** envrcpt) char buf[1024]; char *popen_argv[4]; + pid_t pid; popen_argv[0] = SENDMAIL; popen_argv[1] = "-bv"; @@ -834,7 +838,7 @@ mlfi_envrcpt(SMFICTX* ctx, char** envrcpt) debug(D_RCPT, "calling %s -bv %s", SENDMAIL, envrcpt[0]); - p = popenv(popen_argv, "r"); + p = popenv(popen_argv, "r", &pid); if (!p) { debug(D_RCPT, "popenv failed(%s). Will not expand aliases", strerror(errno)); @@ -863,6 +867,8 @@ mlfi_envrcpt(SMFICTX* ctx, char** envrcpt) } } fclose(p); p = NULL; + waitpid(pid,0,0); + } } else { @@ -2126,11 +2132,12 @@ void warnmacro(char *macro, char *scope) for simplicity, and always reads stdout and stderr in "r" mode. Call fclose to close the FILE. */ -FILE *popenv(char *const argv[], const char *type) +FILE *popenv(char *const argv[], const char *type, pid_t *pid) { FILE *iop; int pdes[2]; int save_errno; + if ((*type != 'r' && *type != 'w') || type[1]) { errno = EINVAL; @@ -2138,7 +2145,9 @@ FILE *popenv(char *const argv[], const char *type) } if (pipe(pdes) < 0) return (NULL); - switch (fork()) { + + *pid = fork(); + switch (*pid) { case -1: /* Error. */ save_errno = errno;