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); |