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);
         }
       }
 
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
ProFTPD Developers List
<[email protected]>
https://lists.sourceforge.net/lists/listinfo/proftp-devel

Reply via email to