diff options
Diffstat (limited to 'src/lib/libc/net/rcmd.c')
| -rw-r--r-- | src/lib/libc/net/rcmd.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/lib/libc/net/rcmd.c b/src/lib/libc/net/rcmd.c index a0adaf8ed0..3c483a809b 100644 --- a/src/lib/libc/net/rcmd.c +++ b/src/lib/libc/net/rcmd.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | */ | 34 | */ |
| 35 | 35 | ||
| 36 | #if defined(LIBC_SCCS) && !defined(lint) | 36 | #if defined(LIBC_SCCS) && !defined(lint) |
| 37 | static char *rcsid = "$OpenBSD: rcmd.c,v 1.20 1997/04/05 21:13:15 millert Exp $"; | 37 | static char *rcsid = "$OpenBSD: rcmd.c,v 1.21 1997/05/28 21:40:11 deraadt Exp $"; |
| 38 | #endif /* LIBC_SCCS and not lint */ | 38 | #endif /* LIBC_SCCS and not lint */ |
| 39 | 39 | ||
| 40 | #include <sys/param.h> | 40 | #include <sys/param.h> |
| @@ -69,7 +69,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
| 69 | { | 69 | { |
| 70 | struct hostent *hp; | 70 | struct hostent *hp; |
| 71 | struct sockaddr_in sin, from; | 71 | struct sockaddr_in sin, from; |
| 72 | fd_set reads; | 72 | fd_set *readsp = NULL; |
| 73 | int oldmask; | 73 | int oldmask; |
| 74 | pid_t pid; | 74 | pid_t pid; |
| 75 | int s, lport, timo; | 75 | int s, lport, timo; |
| @@ -166,6 +166,10 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
| 166 | 166 | ||
| 167 | if (s2 < 0) | 167 | if (s2 < 0) |
| 168 | goto bad; | 168 | goto bad; |
| 169 | readsp = (fd_set *)malloc(howmany(MAX(s, s2), NFDBITS) * | ||
| 170 | sizeof(fd_mask)); | ||
| 171 | if (readsp == NULL) | ||
| 172 | goto bad; | ||
| 169 | listen(s2, 1); | 173 | listen(s2, 1); |
| 170 | (void)snprintf(num, sizeof(num), "%d", lport); | 174 | (void)snprintf(num, sizeof(num), "%d", lport); |
| 171 | if (write(s, num, strlen(num)+1) != strlen(num)+1) { | 175 | if (write(s, num, strlen(num)+1) != strlen(num)+1) { |
| @@ -176,12 +180,12 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
| 176 | goto bad; | 180 | goto bad; |
| 177 | } | 181 | } |
| 178 | again: | 182 | again: |
| 179 | FD_ZERO(&reads); | 183 | FD_ZERO(readsp); |
| 180 | FD_SET(s, &reads); | 184 | FD_SET(s, readsp); |
| 181 | FD_SET(s2, &reads); | 185 | FD_SET(s2, readsp); |
| 182 | errno = 0; | 186 | errno = 0; |
| 183 | if (select(MAX(s, s2) + 1, &reads, 0, 0, 0) < 1 || | 187 | if (select(MAX(s, s2) + 1, readsp, 0, 0, 0) < 1 || |
| 184 | !FD_ISSET(s2, &reads)) { | 188 | !FD_ISSET(s2, readsp)) { |
| 185 | if (errno != 0) | 189 | if (errno != 0) |
| 186 | (void)fprintf(stderr, | 190 | (void)fprintf(stderr, |
| 187 | "rcmd: select (setting up stderr): %s\n", | 191 | "rcmd: select (setting up stderr): %s\n", |
| @@ -235,11 +239,14 @@ again: | |||
| 235 | goto bad2; | 239 | goto bad2; |
| 236 | } | 240 | } |
| 237 | sigsetmask(oldmask); | 241 | sigsetmask(oldmask); |
| 242 | free(readsp); | ||
| 238 | return (s); | 243 | return (s); |
| 239 | bad2: | 244 | bad2: |
| 240 | if (lport) | 245 | if (lport) |
| 241 | (void)close(*fd2p); | 246 | (void)close(*fd2p); |
| 242 | bad: | 247 | bad: |
| 248 | if (readsp) | ||
| 249 | free(readsp); | ||
| 243 | (void)close(s); | 250 | (void)close(s); |
| 244 | sigsetmask(oldmask); | 251 | sigsetmask(oldmask); |
| 245 | return (-1); | 252 | return (-1); |
