summaryrefslogtreecommitdiff
path: root/ssh-keyscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'ssh-keyscan.c')
-rw-r--r--ssh-keyscan.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/ssh-keyscan.c b/ssh-keyscan.c
index fe03c145c..ab46e9edb 100644
--- a/ssh-keyscan.c
+++ b/ssh-keyscan.c
@@ -8,7 +8,7 @@
8 */ 8 */
9 9
10#include "includes.h" 10#include "includes.h"
11RCSID("$OpenBSD: ssh-keyscan.c,v 1.18 2001/03/03 06:53:12 deraadt Exp $"); 11RCSID("$OpenBSD: ssh-keyscan.c,v 1.19 2001/03/03 21:19:41 millert Exp $");
12 12
13#if defined(HAVE_SYS_QUEUE_H) && !defined(HAVE_BOGUS_SYS_QUEUE_H) 13#if defined(HAVE_SYS_QUEUE_H) && !defined(HAVE_BOGUS_SYS_QUEUE_H)
14#include <sys/queue.h> 14#include <sys/queue.h>
@@ -45,7 +45,8 @@ extern char *__progname;
45#else 45#else
46char *__progname; 46char *__progname;
47#endif 47#endif
48fd_set read_wait; 48fd_set *read_wait;
49size_t read_wait_size;
49int ncon; 50int ncon;
50 51
51/* 52/*
@@ -361,7 +362,7 @@ conalloc(char *iname, char *oname)
361 gettimeofday(&fdcon[s].c_tv, NULL); 362 gettimeofday(&fdcon[s].c_tv, NULL);
362 fdcon[s].c_tv.tv_sec += timeout; 363 fdcon[s].c_tv.tv_sec += timeout;
363 TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link); 364 TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link);
364 FD_SET(s, &read_wait); 365 FD_SET(s, read_wait);
365 ncon++; 366 ncon++;
366 return (s); 367 return (s);
367} 368}
@@ -378,7 +379,7 @@ confree(int s)
378 xfree(fdcon[s].c_data); 379 xfree(fdcon[s].c_data);
379 fdcon[s].c_status = CS_UNUSED; 380 fdcon[s].c_status = CS_UNUSED;
380 TAILQ_REMOVE(&tq, &fdcon[s], c_link); 381 TAILQ_REMOVE(&tq, &fdcon[s], c_link);
381 FD_CLR(s, &read_wait); 382 FD_CLR(s, read_wait);
382 ncon--; 383 ncon--;
383} 384}
384 385
@@ -481,7 +482,7 @@ conread(int s)
481void 482void
482conloop(void) 483conloop(void)
483{ 484{
484 fd_set r, e; 485 fd_set *r, *e;
485 struct timeval seltime, now; 486 struct timeval seltime, now;
486 int i; 487 int i;
487 con *c; 488 con *c;
@@ -501,18 +502,24 @@ conloop(void)
501 } else 502 } else
502 seltime.tv_sec = seltime.tv_usec = 0; 503 seltime.tv_sec = seltime.tv_usec = 0;
503 504
504 r = e = read_wait; 505 r = xmalloc(read_wait_size);
505 while (select(maxfd, &r, NULL, &e, &seltime) == -1 && 506 memcpy(r, read_wait, read_wait_size);
507 e = xmalloc(read_wait_size);
508 memcpy(e, read_wait, read_wait_size);
509
510 while (select(maxfd, r, NULL, e, &seltime) == -1 &&
506 (errno == EAGAIN || errno == EINTR)) 511 (errno == EAGAIN || errno == EINTR))
507 ; 512 ;
508 513
509 for (i = 0; i < maxfd; i++) { 514 for (i = 0; i < maxfd; i++) {
510 if (FD_ISSET(i, &e)) { 515 if (FD_ISSET(i, e)) {
511 error("%s: exception!", fdcon[i].c_name); 516 error("%s: exception!", fdcon[i].c_name);
512 confree(i); 517 confree(i);
513 } else if (FD_ISSET(i, &r)) 518 } else if (FD_ISSET(i, r))
514 conread(i); 519 conread(i);
515 } 520 }
521 xfree(r);
522 xfree(e);
516 523
517 c = tq.tqh_first; 524 c = tq.tqh_first;
518 while (c && (c->c_tv.tv_sec < now.tv_sec || 525 while (c && (c->c_tv.tv_sec < now.tv_sec ||
@@ -612,6 +619,10 @@ main(int argc, char **argv)
612 fdcon = xmalloc(maxfd * sizeof(con)); 619 fdcon = xmalloc(maxfd * sizeof(con));
613 memset(fdcon, 0, maxfd * sizeof(con)); 620 memset(fdcon, 0, maxfd * sizeof(con));
614 621
622 read_wait_size = howmany(maxfd, NFDBITS) * sizeof(fd_mask);
623 read_wait = xmalloc(read_wait_size);
624 memset(read_wait, 0, read_wait_size);
625
615 do { 626 do {
616 while (ncon < MAXCON) { 627 while (ncon < MAXCON) {
617 char *name; 628 char *name;