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:
parent
39b96ba75d
commit
e25d3184d0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=117352
@ -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';
|
||||
|
Loading…
Reference in New Issue
Block a user