From 20eeebec9f2d042124148e79ecc26c802a32c317 Mon Sep 17 00:00:00 2001 From: Theo de Raadt Date: Sat, 4 Dec 2004 18:00:44 +0000 Subject: reply() used to play a lot with stdout, expecially fflush(stdout). The recent change is to avoid stdio. That's good, except there are nearly 130 calls to this function, yet what if one of them depended on fflush() or something else in this code? The semantic change was never checked. That is not how we do development -- back this out until we know that checking work has been done. --- libexec/ftpd/ftpcmd.y | 5 +++-- libexec/ftpd/ftpd.c | 34 +++++++++++++++++----------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y index 1f2ab22fdb5..2f774c30882 100644 --- a/libexec/ftpd/ftpcmd.y +++ b/libexec/ftpd/ftpcmd.y @@ -1,4 +1,4 @@ -/* $OpenBSD: ftpcmd.y,v 1.45 2004/12/03 23:57:40 moritz Exp $ */ +/* $OpenBSD: ftpcmd.y,v 1.46 2004/12/04 18:00:43 deraadt Exp $ */ /* $NetBSD: ftpcmd.y,v 1.7 1996/04/08 19:03:11 jtc Exp $ */ /* @@ -44,7 +44,7 @@ static const char sccsid[] = "@(#)ftpcmd.y 8.3 (Berkeley) 4/6/94"; #else static const char rcsid[] = - "$OpenBSD: ftpcmd.y,v 1.45 2004/12/03 23:57:40 moritz Exp $"; + "$OpenBSD: ftpcmd.y,v 1.46 2004/12/04 18:00:43 deraadt Exp $"; #endif #endif /* not lint */ @@ -1170,6 +1170,7 @@ toolong(signo) { struct syslog_data sdata = SYSLOG_DATA_INIT; + /* XXX signal races */ reply(421, "Timeout (%d seconds): closing control connection.", timeout); if (logging) diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c index 82206351a02..a27bba5693b 100644 --- a/libexec/ftpd/ftpd.c +++ b/libexec/ftpd/ftpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ftpd.c,v 1.160 2004/12/03 23:57:40 moritz Exp $ */ +/* $OpenBSD: ftpd.c,v 1.161 2004/12/04 18:00:43 deraadt Exp $ */ /* $NetBSD: ftpd.c,v 1.15 1995/06/03 22:46:47 mycroft Exp $ */ /* @@ -70,7 +70,7 @@ static const char copyright[] = static const char sccsid[] = "@(#)ftpd.c 8.4 (Berkeley) 4/16/94"; #else static const char rcsid[] = - "$OpenBSD: ftpd.c,v 1.160 2004/12/03 23:57:40 moritz Exp $"; + "$OpenBSD: ftpd.c,v 1.161 2004/12/04 18:00:43 deraadt Exp $"; #endif #endif /* not lint */ @@ -1907,27 +1907,27 @@ fatal(char *s) void reply(int n, const char *fmt, ...) { - char *p, *next; - char msg[BUFSIZ]; - char buf[BUFSIZ]; + char *buf, *p, *next; + int rval; va_list ap; - struct syslog_data sdata = SYSLOG_DATA_INIT; va_start(ap, fmt); - vsnprintf(msg, sizeof(msg), fmt, ap); + rval = vasprintf(&buf, fmt, ap); va_end(ap); - - next = msg; - + if (rval == -1 || buf == NULL) { + printf("412 Local resource failure: malloc\r\n"); + fflush(stdout); + dologout(1); + } + next = buf; while ((p = strsep(&next, "\n\r"))) { - snprintf(buf, sizeof(buf), "%d%s %s\r\n", n, - (next != '\0') ? "-" : "", p); - write(STDOUT_FILENO, buf, strlen(buf)); - if (debug) { - buf[strlen(buf) - 2] = '\0'; - syslog_r(LOG_DEBUG, &sdata, "<--- %s", buf); - } + printf("%d%s %s\r\n", n, (next != '\0') ? "-" : "", p); + if (debug) + syslog(LOG_DEBUG, "<--- %d%s %s", n, + (next != '\0') ? "-" : "", p); } + (void)fflush(stdout); + free(buf); } void -- cgit v1.2.3