Don't send 150 response unless data connection successful for data transfers.
Correctly filter \r\r\n during ascii receives. (all from Steve Jacobson)
SCCS-vsn: libexec/ftpd/ftpd.c 5.6
#endif not lint
#ifndef lint
#endif not lint
#ifndef lint
-static char sccsid[] = "@(#)ftpd.c 5.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)ftpd.c 5.6 (Berkeley) %G%";
int argc;
char *argv[];
{
int argc;
char *argv[];
{
if (signal(SIGURG, myoob) < 0) {
syslog(LOG_ERR, "signal: %m");
}
if (signal(SIGURG, myoob) < 0) {
syslog(LOG_ERR, "signal: %m");
}
+ /* handle urgent data inline */
+#ifdef SO_OOBINLINE
+ if (setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)) < 0) {
+ syslog(LOG_ERR, "setsockopt: %m");
+ }
+#endif SO_OOBINLINE
- if (ioctl(fileno(stdin), (int) SIOCSPGRP, (char *) &pgid) < 0) {
+ if (ioctl(fileno(stdin), SIOCSPGRP, (char *) &pgid) < 0) {
syslog(LOG_ERR, "ioctl: %m");
}
dolog(&his_addr);
syslog(LOG_ERR, "ioctl: %m");
}
dolog(&his_addr);
sys_errlist[errno]);
return (NULL);
}
sys_errlist[errno]);
return (NULL);
}
- reply(150, "Opening data connection for %s (%s,%d)%s.",
- name, inet_ntoa(data_dest.sin_addr),
- ntohs(data_dest.sin_port), sizebuf);
data = fileno(file);
while (connect(data, &data_dest, sizeof (data_dest)) < 0) {
if (errno == EADDRINUSE && retry < swaitmax) {
data = fileno(file);
while (connect(data, &data_dest, sizeof (data_dest)) < 0) {
if (errno == EADDRINUSE && retry < swaitmax) {
data = -1;
return (NULL);
}
data = -1;
return (NULL);
}
+ reply(150, "Opening data connection for %s (%s,%d)%s.",
+ name, inet_ntoa(data_dest.sin_addr),
+ ntohs(data_dest.sin_port), sizebuf);
transflag = 0;
return (1);
}
transflag = 0;
return (1);
}
+ (void) putc('\r', outstr);
+ (void) putc(c, outstr);
/* if (c == '\r') */
/* putc ('\0', outstr); */
}
/* if (c == '\r') */
/* putc ('\0', outstr); */
}
case TYPE_A:
while ((c = getc(instr)) != EOF) {
case TYPE_A:
while ((c = getc(instr)) != EOF) {
if (ferror (outstr)) {
transflag = 0;
return (1);
}
if ((c = getc(instr)) != '\n')
if (ferror (outstr)) {
transflag = 0;
return (1);
}
if ((c = getc(instr)) != '\n')
+ (void) putc ('\r', outstr);
/* if (c == '\0') */
/* continue; */
}
/* if (c == '\0') */
/* continue; */
}
+ (void) putc (c, outstr);
}
transflag = 0;
if (ferror (instr) || ferror (outstr))
}
transflag = 0;
if (ferror (instr) || ferror (outstr))
- int aflag = 0, atmark;
- char c, *cp;
+ /* only process if transfer occurring */
- for (;;) {
- if (ioctl(fileno(stdin), (int) SIOCATMARK, (char *) &atmark) < 0) {
- syslog(LOG_ERR, "ioctl: %m");
- break;
- }
- if (atmark)
- break;
- (void) read(fileno(stdin), &c, 1);
- }
- (void) recv(fileno(stdin), &c, 1, MSG_OOB);
- (void) read(fileno(stdin), &c, 1);
- for (;;) {
- if (ioctl(fileno(stdin), (int) SIOCATMARK, (char *) &atmark) < 0) {
- syslog(LOG_ERR, "ioctl: %m");
- break;
- }
- if (atmark)
- break;
- (void) read(fileno(stdin), &c, 1);
- if (c == IAC || c == IP)
- aflag++;
- }
- (void) recv(fileno(stdin), &c, 1, MSG_OOB);
- if (c == IAC)
- aflag++;
- (void) read(fileno(stdin), &c, 1);
- if (c == DM)
- aflag++;
- if (aflag != 4)
- return;
- (void) getline(cp, 7, stdin);
+ if (getline(cp, 7, stdin) == NULL) {
+ reply(221, "You could at least say goodby.");
+ dologout(0);
+ }
upper(cp);
if (strcmp(cp, "ABOR\r\n"))
return;
upper(cp);
if (strcmp(cp, "ABOR\r\n"))
return;