summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authoryar <yar@FreeBSD.org>2003-07-09 13:54:33 +0000
committeryar <yar@FreeBSD.org>2003-07-09 13:54:33 +0000
commitbeedaf29a12e8ffafdcd93268ebb750b3b44d254 (patch)
tree2e624d0fe22b1aefbd2c1cb7783e27c2947049ea /libexec
parent94167f7347294d2c3505132eb74cae8b085df169 (diff)
downloadFreeBSD-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')
-rw-r--r--libexec/ftpd/ftpcmd.y6
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';
OpenPOWER on IntegriCloud