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
This commit is contained in:
Yaroslav Tykhiy 2003-07-09 13:54:33 +00:00
parent 39b96ba75d
commit e25d3184d0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=117352

View File

@ -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';