Good day,
I've had a nasty 'mail loss' experience with procmail and I believe that
rpipe() is the cause. The system had exhausted its file descriptors
limit and rpipe() could not create pipes, and reported this to callers;
but its return value is never checked anywhere! Here's my proposed fix.
--- src/pipes.c.orig 2001-09-11 08:58:44.000000000 +0400
+++ src/pipes.c
@@ -152,15 +152,17 @@ int pipthrough(line,source,len)char*line
}
}
else
-pip: rpipe(pbackfd);
- rpipe(pinfd); /* main pipes
setup */
+pip:
+ if (rpipe(pbackfd) < 0) stermchild();
+ if (rpipe(pinfd) < 0) stermchild(); /* main pipes setup */
if(!(pidchild=sfork())) /* create a sending procmail */
{ if(Stdout&&backblock)
backlen=strlen(backblock);
else
backblock=source,backlen=len;
childsetup();rclose(PRDI);rclose(PRDB);
- rpipe(poutfd);rclose(STDOUT);
+ if (rpipe(poutfd) < 0) stermchild();
+ rclose(STDOUT);
if(!(pidfilt=sfork())) /* create the filter */
{ rclose(PWRB);rclose(PWRO);rdup(PWRI);rclose(PWRI);getstdin(PRDO);
callnewprog(line);
@@ -236,7 +238,7 @@ long pipin(line,source,len,asgnlastf)cha
}
}
#endif
- rpipe(poutfd);
+ if (rpipe(poutfd) < 0) stermchild();
if(!(pidchild=sfork())) /* spawn program */
rclose(PWRO),shutdesc(),getstdin(PRDO),callnewprog(line);
rclose(PRDO);
@@ -298,9 +300,13 @@ char*readdyn(mb,filled,oldfilled)memblk*
char*fromprog(name,dest,max)char*name;char*const dest;size_t max;
{ int pinfd[2],poutfd[2];int i;char*p;
- concon('\n');rpipe(pinfd);inittmout(name);
+ concon('\n');
+ if (rpipe(pinfd) < 0) stermchild();
+ inittmout(name);
if(!(pidchild=sfork())) /* create a sending procmail */
- { Stdout=name;childsetup();rclose(PRDI);rpipe(poutfd);rclose(STDOUT);
+ { Stdout=name;childsetup();rclose(PRDI);
+ if (rpipe(poutfd) < 0) stermchild();
+ rclose(STDOUT);
if(!(pidfilt=sfork())) /* spawn program/filter */
rclose(PWRO),rdup(PWRI),rclose(PWRI),getstdin(PRDO),callnewprog(name);
rclose(PWRI);rclose(PRDO);
@@ -335,7 +341,8 @@ void exectrap(tp)const char*const tp;
{ int poutfd[2];
rawnonl=0; /* force a trailing
newline */
metaparse(tp);concon('\n'); /* expand $TRAP */
- rpipe(poutfd);inittmout(buf);
+ if (rpipe(poutfd) < 0) stermchild();
+ inittmout(buf);
if(!(pidchild=sfork())) /* connect stdout to stderr before
exec */
{ rclose(PWRO);getstdin(PRDO);rclose(STDOUT);rdup(STDERR);
callnewprog(buf); /* trap your heart out */
--
Sergey Svishchev
____________________________________________________________
procmail mailing list Procmail homepage: http://www.procmail.org/
procmail(_at_)lists(_dot_)RWTH-Aachen(_dot_)DE
http://MailMan.RWTH-Aachen.DE/mailman/listinfo/procmail