summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/rcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/net/rcmd.c')
-rw-r--r--src/lib/libc/net/rcmd.c21
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)
37static char *rcsid = "$OpenBSD: rcmd.c,v 1.20 1997/04/05 21:13:15 millert Exp $"; 37static 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 }
178again: 182again:
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);
239bad2: 244bad2:
240 if (lport) 245 if (lport)
241 (void)close(*fd2p); 246 (void)close(*fd2p);
242bad: 247bad:
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);