From beedaf29a12e8ffafdcd93268ebb750b3b44d254 Mon Sep 17 00:00:00 2001 From: yar Date: Wed, 9 Jul 2003 13:54:33 +0000 Subject: Block SIGURG while reading from the control channel. Rationale: SIGURG is configured by ftpd to interrupt system calls, which is useful during data transfers. However, SIGURG could interrupt I/O on the control channel as well, which was mistaken for the end of the session. A practical example could be aborting the download of a tiny file, when the abort sequence reached ftpd after ftpd had passed the file data to the system and returned to its command loop. Reported by: ceri MFC after: 1 week --- libexec/ftpd/ftpcmd.y | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'libexec') diff --git a/libexec/ftpd/ftpcmd.y b/libexec/ftpd/ftpcmd.y index 3374439..84c028b 100644 --- a/libexec/ftpd/ftpcmd.y +++ b/libexec/ftpd/ftpcmd.y @@ -1169,6 +1169,7 @@ getline(char *s, int n, FILE *iop) { int c; register char *cs; + sigset_t sset, osset; cs = s; /* tmpline may contain saved command from urgent mode interruption */ @@ -1184,6 +1185,10 @@ getline(char *s, int n, FILE *iop) if (c == 0) tmpline[0] = '\0'; } + /* SIGURG would interrupt stdio if not blocked during the read loop */ + sigemptyset(&sset); + sigaddset(&sset, SIGURG); + sigprocmask(SIG_BLOCK, &sset, &osset); while ((c = getc(iop)) != EOF) { c &= 0377; if (c == IAC) { @@ -1216,6 +1221,7 @@ getline(char *s, int n, FILE *iop) break; } got_eof: + sigprocmask(SIG_SETMASK, &osset, NULL); if (c == EOF && cs == s) return (NULL); *cs++ = '\0'; -- cgit v1.1