diff options
author | yar <yar@FreeBSD.org> | 2003-07-09 13:54:33 +0000 |
---|---|---|
committer | yar <yar@FreeBSD.org> | 2003-07-09 13:54:33 +0000 |
commit | beedaf29a12e8ffafdcd93268ebb750b3b44d254 (patch) | |
tree | 2e624d0fe22b1aefbd2c1cb7783e27c2947049ea /libexec/ftpd | |
parent | 94167f7347294d2c3505132eb74cae8b085df169 (diff) | |
download | FreeBSD-src-beedaf29a12e8ffafdcd93268ebb750b3b44d254.zip FreeBSD-src-beedaf29a12e8ffafdcd93268ebb750b3b44d254.tar.gz |
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
Diffstat (limited to 'libexec/ftpd')
-rw-r--r-- | libexec/ftpd/ftpcmd.y | 6 |
1 files changed, 6 insertions, 0 deletions
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'; |