procmail
[Top] [All Lists]

rpipe() return value is never checked

2007-05-07 12:30:11
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

<Prev in Thread] Current Thread [Next in Thread>
  • rpipe() return value is never checked, Sergey Svishchev <=