- markus@cvs.openbsd.org 2001/05/04 14:34:34
     [channels.c]
     channel_new() reallocs channels[], we cannot use Channel *c after calling
     channel_new(), XXX fix this in the future...
diff --git a/ChangeLog b/ChangeLog
index 81ac4cf..559347b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,10 @@
    - stevesk@cvs.openbsd.org 2001/05/04 14:21:56
      [ssh.1 sshd.8]
      typos
+   - markus@cvs.openbsd.org 2001/05/04 14:34:34
+     [channels.c]
+     channel_new() reallocs channels[], we cannot use Channel *c after calling
+     channel_new(), XXX fix this in the future...
 
 20010504
  - OpenBSD CVS Sync
@@ -5333,4 +5337,4 @@
  - Wrote replacements for strlcpy and mkdtemp
  - Released 1.0pre1
 
-$Id: ChangeLog,v 1.1197 2001/05/04 22:38:43 mouring Exp $
+$Id: ChangeLog,v 1.1198 2001/05/04 22:40:28 mouring Exp $
diff --git a/channels.c b/channels.c
index 23ea98e..503a814 100644
--- a/channels.c
+++ b/channels.c
@@ -40,7 +40,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: channels.c,v 1.111 2001/05/03 15:07:39 stevesk Exp $");
+RCSID("$OpenBSD: channels.c,v 1.112 2001/05/04 14:34:34 markus Exp $");
 
 #include <openssl/rsa.h>
 #include <openssl/dsa.h>
@@ -657,7 +657,7 @@
 channel_post_x11_listener(Channel *c, fd_set * readset, fd_set * writeset)
 {
 	struct sockaddr addr;
-	int newsock, newch;
+	int newsock, newch, oldch;
 	socklen_t addrlen;
 	char buf[16384], *remote_ipaddr;
 	int remote_port;
@@ -675,10 +675,12 @@
 		snprintf(buf, sizeof buf, "X11 connection from %.200s port %d",
 		    remote_ipaddr, remote_port);
 
+		oldch = c->self;
 		newch = channel_new("x11",
 		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
 		    c->local_window_max, c->local_maxpacket,
 		    0, xstrdup(buf), 1);
+		c = channel_lookup(oldch);
 		if (compat20) {
 			packet_start(SSH2_MSG_CHANNEL_OPEN);
 			packet_put_cstring("x11");
@@ -762,7 +764,7 @@
 {
 	Channel *nc;
 	struct sockaddr addr;
-	int newsock, newch, nextstate;
+	int newsock, newch, nextstate, oldch;
 	socklen_t addrlen;
 	char *rtype;
 
@@ -782,11 +784,13 @@
 			error("accept: %.100s", strerror(errno));
 			return;
 		}
+		oldch = c->self;
 		newch = channel_new(rtype,
 		    nextstate, newsock, newsock, -1,
 		    c->local_window_max, c->local_maxpacket,
 		    0, xstrdup(rtype), 1);
 
+		c = channel_lookup(oldch);
 		nc = channel_lookup(newch);
 		if (nc == NULL) {
 			error("xxx: no new channel:");
@@ -809,7 +813,7 @@
 channel_post_auth_listener(Channel *c, fd_set * readset, fd_set * writeset)
 {
 	struct sockaddr addr;
-	int newsock, newch;
+	int newsock, newch, oldch;
 	socklen_t addrlen;
 
 	if (FD_ISSET(c->sock, readset)) {
@@ -819,10 +823,12 @@
 			error("accept from auth socket: %.100s", strerror(errno));
 			return;
 		}
+		oldch = c->self;
 		newch = channel_new("accepted auth socket",
 		    SSH_CHANNEL_OPENING, newsock, newsock, -1,
 		    c->local_window_max, c->local_maxpacket,
 		    0, xstrdup("accepted auth socket"), 1);
+		c = channel_lookup(oldch);
 		if (compat20) {
 			packet_start(SSH2_MSG_CHANNEL_OPEN);
 			packet_put_cstring("auth-agent@openssh.com");
@@ -1138,6 +1144,7 @@
 		if (ftab[c->type] == NULL)
 			continue;
 		(*ftab[c->type])(c, readset, writeset);
+		c = &channels[i]; /* XXX realloc */
 		if (chan_is_dead(c)) {
 			/*
 			 * we have to remove the fd's from the select mask