Diff

Differences From Artifact [cebe9a5a22]:

To Artifact [2796ee9ea9]:


6156
6157
6158
6159
6160
6161
6162
6163

6164



6165
6166
6167
6168
6169
6170
6171
6172

6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186


6187
6188
6189
6190
6191
6192
6193
6194
6195


6196
6197
6198
6199
6200
6201
6202
6156
6157
6158
6159
6160
6161
6162

6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199


6200
6201
6202
6203
6204
6205
6206
6207
6208







-
+

+
+
+








+














+
+







-
-
+
+








		if (typelen == 3 && !memcmp(type, "x11", 3)) {
		    char *addrstr;

                    ssh_pkt_getstring(ssh, &peeraddr, &peeraddrlen);
		    addrstr = snewn(peeraddrlen+1, char);
		    memcpy(addrstr, peeraddr, peeraddrlen);
		    peeraddr[peeraddrlen] = '\0';
		    addrstr[peeraddrlen] = '\0';
                    peerport = ssh_pkt_getuint32(ssh);

		    logeventf(ssh, "Received X11 connect request from %s:%d",
			      addrstr, peerport);

		    if (!ssh->X11_fwd_enabled)
			error = "X11 forwarding is not enabled";
		    else if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c,
				      ssh->x11auth, addrstr, peerport,
				      &ssh->cfg) != NULL) {
			error = "Unable to open an X11 connection";
		    } else {
			logevent("Opening X11 forward connection succeeded");
			c->type = CHAN_X11;
		    }

		    sfree(addrstr);
		} else if (typelen == 15 &&
			   !memcmp(type, "forwarded-tcpip", 15)) {
		    struct ssh_rportfwd pf, *realpf;
		    char *dummy;
		    int dummylen;
		    ssh_pkt_getstring(ssh, &dummy, &dummylen);/* skip address */
		    pf.sport = ssh_pkt_getuint32(ssh);
                    ssh_pkt_getstring(ssh, &peeraddr, &peeraddrlen);
                    peerport = ssh_pkt_getuint32(ssh);
		    realpf = find234(ssh->rportfwds, &pf, NULL);
		    logeventf(ssh, "Received remote port %d open request "
			      "from %s:%d", pf.sport, peeraddr, peerport);
		    if (realpf == NULL) {
			error = "Remote port is not recognised";
		    } else {
			const char *e = pfd_newconnect(&c->u.pfd.s,
						       realpf->dhost,
						       realpf->dport, c,
						       &ssh->cfg);
			logeventf(ssh, "Received remote port open request"
				  " for %s:%d", realpf->dhost, realpf->dport);
			logeventf(ssh, "Attempting to forward remote port to "
				  "%s:%d", realpf->dhost, realpf->dport);
			if (e != NULL) {
			    logeventf(ssh, "Port open failed: %s", e);
			    error = "Port open failed";
			} else {
			    logevent("Forwarded port opened successfully");
			    c->type = CHAN_SOCKDATA;
			}
6217
6218
6219
6220
6221
6222
6223

6224
6225
6226
6227
6228
6229
6230
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237







+







		if (error) {
		    ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_OPEN_FAILURE);
		    ssh2_pkt_adduint32(ssh, c->remoteid);
		    ssh2_pkt_adduint32(ssh, SSH2_OPEN_CONNECT_FAILED);
		    ssh2_pkt_addstring(ssh, error);
		    ssh2_pkt_addstring(ssh, "en");	/* language tag */
		    ssh2_pkt_send(ssh);
		    logeventf(ssh, "Rejected channel open: %s", error);
		    sfree(c);
		} else {
		    c->localid = alloc_channel_id(ssh);
		    c->closes = 0;
		    c->v.v2.locwindow = OUR_V2_WINSIZE;
		    c->v.v2.remwindow = winsize;
		    c->v.v2.remmaxpkt = pktsize;