summaryrefslogtreecommitdiffstats
path: root/packet.c
diff options
context:
space:
mode:
authorBen Lindstrom <mouring@eviladmin.org>2001-03-05 07:07:49 +0000
committerBen Lindstrom <mouring@eviladmin.org>2001-03-05 07:07:49 +0000
commitcb978aa057b1e36a2ac6e738cc055a70c6c48fd8 (patch)
tree63fccb3ae8a44db98439b5cb1fed12d862d6ac99 /packet.c
parentcb80bdf6d5c2e232e751187f86b6fa68d959fcf9 (diff)
- millert@cvs.openbsd.org 2001/03/03 21:41:07
[packet.c] Dynamically allocate fd_set; deraadt@ OK
Diffstat (limited to 'packet.c')
-rw-r--r--packet.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/packet.c b/packet.c
index 419b2f77..1a634cff 100644
--- a/packet.c
+++ b/packet.c
@@ -37,7 +37,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: packet.c,v 1.55 2001/03/01 02:45:10 deraadt Exp $");
+RCSID("$OpenBSD: packet.c,v 1.56 2001/03/03 21:41:07 millert Exp $");
#include "xmalloc.h"
#include "buffer.h"
@@ -660,10 +660,13 @@ int
packet_read(int *payload_len_ptr)
{
int type, len;
- fd_set set;
+ fd_set *setp;
char buf[8192];
DBG(debug("packet_read()"));
+ setp = (fd_set *)xmalloc(howmany(connection_in+1, NFDBITS) *
+ sizeof(fd_mask));
+
/* Since we are blocking, ensure that all written packets have been sent. */
packet_write_wait();
@@ -678,17 +681,20 @@ packet_read(int *payload_len_ptr)
|| type == SSH_CMSG_EXIT_CONFIRMATION))
packet_integrity_check(*payload_len_ptr, 0, type);
/* If we got a packet, return it. */
- if (type != SSH_MSG_NONE)
+ if (type != SSH_MSG_NONE) {
+ xfree(setp);
return type;
+ }
/*
* Otherwise, wait for some data to arrive, add it to the
* buffer, and try again.
*/
- FD_ZERO(&set);
- FD_SET(connection_in, &set);
+ memset(setp, 0, howmany(connection_in + 1, NFDBITS) *
+ sizeof(fd_mask));
+ FD_SET(connection_in, setp);
/* Wait for some data to arrive. */
- while (select(connection_in + 1, &set, NULL, NULL, NULL) == -1 &&
+ while (select(connection_in + 1, setp, NULL, NULL, NULL) == -1 &&
(errno == EAGAIN || errno == EINTR))
;
@@ -1194,17 +1200,21 @@ packet_write_poll()
void
packet_write_wait()
{
+ fd_set *setp;
+
+ setp = (fd_set *)xmalloc(howmany(connection_out + 1, NFDBITS) *
+ sizeof(fd_mask));
packet_write_poll();
while (packet_have_data_to_write()) {
- fd_set set;
-
- FD_ZERO(&set);
- FD_SET(connection_out, &set);
- while (select(connection_out + 1, NULL, &set, NULL, NULL) == -1 &&
+ memset(setp, 0, howmany(connection_out + 1, NFDBITS) *
+ sizeof(fd_mask));
+ FD_SET(connection_out, setp);
+ while (select(connection_out + 1, NULL, setp, NULL, NULL) == -1 &&
(errno == EAGAIN || errno == EINTR))
;
packet_write_poll();
}
+ xfree(setp);
}
/* Returns true if there is buffered data to write to the connection. */