Download | Plain Text | Line Numbers


--- qmail-smtpd.c.orig	Mon Jan 23 13:22:14 2006
+++ qmail-smtpd.c	Mon Jan 23 13:17:32 2006
@@ -827,20 +827,22 @@
   int child;
   int wstat;
   int pi[2];
+  int stderrcopy;
 
   if (!stralloc_0(&user)) die_nomem();
   if (!stralloc_0(&pass)) die_nomem();
   if (!stralloc_0(&resp)) die_nomem();
 
+  stderrcopy = dup(2);
+  if (stderrcopy == -1) return err_pipe();
   if (fd_copy(2,1) == -1) return err_pipe();
-  close(3);
   if (pipe(pi) == -1) return err_pipe();
-  if (pi[0] != 3) return err_pipe();
   switch(child = fork()) {
     case -1:
       return err_fork();
     case 0:
       close(pi[1]);
+      if (0 > fd_copy(3,pi[0])) _exit(1);
       sig_pipedefault();
       execvp(*childargs, childargs);
       _exit(1);
@@ -854,6 +856,8 @@
   if (substdio_flush(&ssup) == -1) return err_write();
 
   close(pi[1]);
+  dup2(stderrcopy, 2);
+  close(stderrcopy);
   byte_zero(pass.s,pass.len);
   byte_zero(upbuf,sizeof upbuf);
   if (wait_pid(&wstat,child) == -1) return err_child();