Hello,
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?
Thanks!
--- a/contrib/mod_exec.c
+++ b/contrib/mod_exec.c
@@ -735,14 +735,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) {
@@ -789,9 +795,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. */
@@ -821,6 +827,7 @@ static int exec_ssystem(cmd_rec *cmd, co
}
}
}
+ free(buf);
}
res = waitpid(pid, &status, WNOHANG);
--- a/contrib/mod_tls.c
+++ b/contrib/mod_tls.c
@@ -1765,10 +1765,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 + 1);
+ stderrlen = read(stderr_pipe[0], stderrbuf, len - 1);
if (stderrlen > 0) {
while (stderrlen &&
(stderrbuf[stderrlen-1] == '\r' ||
@@ -1785,6 +1790,7 @@ static int tls_exec_passphrase_provider(
": error reading stderr from '%s': %s",
tls_passphrase_provider, strerror(errno));
}
+ free(stderrbuf);
}
}
--- a/contrib/mod_sftp/keys.c
+++ b/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);
}
}
------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
ProFTPD Developers List
<proftpd-de...@proftpd.org>
https://lists.sourceforge.net/lists/listinfo/proftp-devel