found 745493 1.3.5-1
thanks

On Sat, 2014-05-03 at 15:31 -0700, TJ Saunders wrote:
> > I just submitted the following patch to Debian BTS:
> > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=745493
> > 
> > This patch use fpathconf() and avoids usage of the constant PIPE_BUF,
> > which is not available on all architectures, especially GNU/Hurd.
> > 
> > The patch, against Debian version 1.3.5~rc4-1, is attached here for
> > convenience. Something to consider for next pre-release?
> 
> I've filed a bug report for this in ProFTPD's Bugzilla instance
> (arguably the best place for a change like this); see:
> 
>   http://bugs.proftpd.org/show_bug.cgi?id=4050

Attached is a re-diffed patch against 1.3.5-1. No further changes. The
attachment in http://bugs.proftpd.org/show_bug.cgi?id=4050 did not make
it into release 1.3.5. I'll try it out and test if it works, and comment
there.
Index: proftpd-dfsg-1.3.5/contrib/mod_exec.c
===================================================================
--- proftpd-dfsg-1.3.5.orig/contrib/mod_exec.c
+++ proftpd-dfsg-1.3.5/contrib/mod_exec.c
@@ -742,14 +742,20 @@ static int exec_ssystem(cmd_rec *cmd, co
 
         if (fds >= 0) {
           int buflen;
-          char buf[PIPE_BUF];
+
+          size_t len = fpathconf(exec_stdout_pipe[0], _PC_PIPE_BUF);
+          char *buf = malloc(len);
+          if (buf == NULL) {
+            exec_log("malloc failed: %s", strerror(errno));
+            return errno;
+          }
 
           /* The child sent us something.  How thoughtful. */
 
           if (FD_ISSET(exec_stdout_pipe[0], &readfds)) {
-            memset(buf, '\0', sizeof(buf));
+            memset(buf, '\0', len);
 
-            buflen = read(exec_stdout_pipe[0], buf, sizeof(buf)-1);
+            buflen = read(exec_stdout_pipe[0], buf, len - 1);
             if (buflen > 0) {
               if (exec_opts & EXEC_OPT_SEND_STDOUT) {
 
@@ -796,9 +802,9 @@ static int exec_ssystem(cmd_rec *cmd, co
           }
 
           if (FD_ISSET(exec_stderr_pipe[0], &readfds)) {
-            memset(buf, '\0', sizeof(buf));
+            memset(buf, '\0', len);
 
-            buflen = read(exec_stderr_pipe[0], buf, sizeof(buf)-1);
+            buflen = read(exec_stdout_pipe[0], buf, len - 1);
             if (buflen > 0) {
 
               /* Trim trailing CRs and LFs. */
@@ -828,6 +834,7 @@ static int exec_ssystem(cmd_rec *cmd, co
               }
             }
           }
+          free(buf);
         }
 
         res = waitpid(pid, &status, WNOHANG);
Index: proftpd-dfsg-1.3.5/contrib/mod_tls.c
===================================================================
--- proftpd-dfsg-1.3.5.orig/contrib/mod_tls.c
+++ proftpd-dfsg-1.3.5/contrib/mod_tls.c
@@ -1787,10 +1787,15 @@ static int tls_exec_passphrase_provider(
 
         if (FD_ISSET(stderr_pipe[0], &readfds)) {
           int stderrlen;
-          char stderrbuf[PIPE_BUF];
 
-          memset(stderrbuf, '\0', sizeof(stderrbuf));
-          stderrlen = read(stderr_pipe[0], stderrbuf, sizeof(stderrbuf)-1);
+          size_t len = fpathconf(stderr_pipe[0], _PC_PIPE_BUF);
+          char *stderrbuf = malloc(len);
+          if (stderrbuf == NULL) {
+            tls_log("malloc failed: %s", strerror(errno));
+            return -1;
+          }
+          memset(stderrbuf, '\0', len);
+          stderrlen = read(stderr_pipe[0], stderrbuf, len - 1);
           if (stderrlen > 0) {
             while (stderrlen &&
                    (stderrbuf[stderrlen-1] == '\r' ||
@@ -1807,6 +1812,7 @@ static int tls_exec_passphrase_provider(
               ": error reading stderr from '%s': %s",
               tls_passphrase_provider, strerror(errno));
           }
+          free(stderrbuf);
         }
       }
 
Index: proftpd-dfsg-1.3.5/contrib/mod_sftp/keys.c
===================================================================
--- proftpd-dfsg-1.3.5.orig/contrib/mod_sftp/keys.c
+++ proftpd-dfsg-1.3.5/contrib/mod_sftp/keys.c
@@ -413,10 +413,15 @@ static int exec_passphrase_provider(serv
 
         if (FD_ISSET(stderr_pipe[0], &readfds)) {
           int stderrlen;
-          char stderrbuf[PIPE_BUF];
 
-          memset(stderrbuf, '\0', sizeof(stderrbuf));
-          stderrlen = read(stderr_pipe[0], stderrbuf, sizeof(stderrbuf)-1);
+          size_t len = fpathconf(stderr_pipe[0], _PC_PIPE_BUF);
+          char *stderrbuf = malloc(len);
+          if (stderrbuf == NULL) {
+            pr_log_pri(PR_LOG_ALERT, MOD_SFTP_VERSION ": Out of memory!");
+            return -1;
+	  }
+          memset(stderrbuf, '\0', len);
+          stderrlen = read(stderr_pipe[0], stderrbuf, len - 1);
           if (stderrlen > 0) {
             while (stderrlen &&
                    (stderrbuf[stderrlen-1] == '\r' ||
@@ -433,6 +438,7 @@ static int exec_passphrase_provider(serv
               ": error reading stderr from '%s': %s",
               passphrase_provider, strerror(errno));
           }
+          free(stderrbuf);
         }
       }
 

Reply via email to