Diff

Differences From Artifact [fcbded294e]:

To Artifact [0b4ba5824c]:


295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
extern void x11_close(Socket);
extern int x11_send(Socket, char *, int);
extern void *x11_invent_auth(char *, int, char *, int);
extern void x11_unthrottle(Socket s);
extern void x11_override_throttle(Socket s, int enable);

extern char *pfd_newconnect(Socket * s, char *hostname, int port, void *c);
extern char *pfd_addforward(char *desthost, int destport, int port,
			    void *backhandle);
extern void pfd_close(Socket s);
extern int pfd_send(Socket s, char *data, int len);
extern void pfd_confirm(Socket s);
extern void pfd_unthrottle(Socket s);
extern void pfd_override_throttle(Socket s, int enable);

static void ssh2_pkt_init(Ssh, int pkt_type);







|
|







295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
extern void x11_close(Socket);
extern int x11_send(Socket, char *, int);
extern void *x11_invent_auth(char *, int, char *, int);
extern void x11_unthrottle(Socket s);
extern void x11_override_throttle(Socket s, int enable);

extern char *pfd_newconnect(Socket * s, char *hostname, int port, void *c);
extern char *pfd_addforward(char *desthost, int destport, char *srcaddr,
			    int port, void *backhandle);
extern void pfd_close(Socket s);
extern int pfd_send(Socket s, char *data, int len);
extern void pfd_confirm(Socket s);
extern void pfd_unthrottle(Socket s);
extern void pfd_override_throttle(Socket s, int enable);

static void ssh2_pkt_init(Ssh, int pkt_type);
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080

3081
3082














3083

3084
3085
3086
3087
3088
3089

3090
3091
3092
3093
3094
3095

3096
3097
3098
3099
3100
3101
3102
	}
    }

    {
	char type;
	int n;
	int sport,dport,sserv,dserv;
	char sports[256], dports[256], host[256];

	ssh->rportfwds = newtree234(ssh_rportcmp_ssh1);
        /* Add port forwardings. */
	ssh->portfwd_strptr = cfg.portfwd;
	while (*ssh->portfwd_strptr) {
	    type = *ssh->portfwd_strptr++;

	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t')














		sports[n++] = *ssh->portfwd_strptr++;

	    sports[n] = 0;
	    if (*ssh->portfwd_strptr == '\t')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':')
		host[n++] = *ssh->portfwd_strptr++;

	    host[n] = 0;
	    if (*ssh->portfwd_strptr == ':')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr)
		dports[n++] = *ssh->portfwd_strptr++;

	    dports[n] = 0;
	    ssh->portfwd_strptr++;
	    dport = atoi(dports);
	    dserv = 0;
	    if (dport == 0) {
		dserv = 1;
		dport = net_service_lookup(dports);







|






>

|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>




|
|
>




|
|
>







3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
	}
    }

    {
	char type;
	int n;
	int sport,dport,sserv,dserv;
	char sports[256], dports[256], saddr[256], host[256];

	ssh->rportfwds = newtree234(ssh_rportcmp_ssh1);
        /* Add port forwardings. */
	ssh->portfwd_strptr = cfg.portfwd;
	while (*ssh->portfwd_strptr) {
	    type = *ssh->portfwd_strptr++;
	    saddr[0] = '\0';
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') {
		if (*ssh->portfwd_strptr == ':') {
		    /*
		     * We've seen a colon in the middle of the
		     * source port number. This means that
		     * everything we've seen until now is the
		     * source _address_, so we'll move it into
		     * saddr and start sports from the beginning
		     * again.
		     */
		    ssh->portfwd_strptr++;
		    sports[n] = '\0';
		    strcpy(saddr, sports);
		    n = 0;
		}
		if (n < 255) sports[n++] = *ssh->portfwd_strptr++;
	    }
	    sports[n] = 0;
	    if (*ssh->portfwd_strptr == '\t')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') {
		if (n < 255) host[n++] = *ssh->portfwd_strptr++;
	    }
	    host[n] = 0;
	    if (*ssh->portfwd_strptr == ':')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr) {
		if (n < 255) dports[n++] = *ssh->portfwd_strptr++;
	    }
	    dports[n] = 0;
	    ssh->portfwd_strptr++;
	    dport = atoi(dports);
	    dserv = 0;
	    if (dport == 0) {
		dserv = 1;
		dport = net_service_lookup(dports);
3113
3114
3115
3116
3117
3118
3119
3120

3121
3122


3123
3124
3125
3126
3127
3128
3129
3130
3131
3132





3133
3134
3135
3136
3137
3138
3139
		if (!sport) {
		    logeventf(ssh, "Service lookup failed for source"
			      " port \"%s\"", sports);
		}
	    }
	    if (sport && dport) {
		if (type == 'L') {
		    pfd_addforward(host, dport, sport, ssh);

		    logeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to"
			      " %s:%.*s%.*s%d%.*s",


			      (int)(sserv ? strlen(sports) : 0), sports,
			      sserv, "(", sport, sserv, ")",
			      host,
			      (int)(dserv ? strlen(dports) : 0), dports,
			      dserv, "(", dport, dserv, ")");
		} else {
		    struct ssh_rportfwd *pf;
		    pf = smalloc(sizeof(*pf));
		    strcpy(pf->dhost, host);
		    pf->dport = dport;





		    if (add234(ssh->rportfwds, pf) != pf) {
			logeventf(ssh, 
				  "Duplicate remote port forwarding to %s:%d",
				  host, dport);
			sfree(pf);
		    } else {
			logeventf(ssh, "Requesting remote port %.*s%.*s%d%.*s"







|
>
|
|
>
>










>
>
>
>
>







3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
		if (!sport) {
		    logeventf(ssh, "Service lookup failed for source"
			      " port \"%s\"", sports);
		}
	    }
	    if (sport && dport) {
		if (type == 'L') {
		    pfd_addforward(host, dport, *saddr ? saddr : NULL,
				   sport, ssh);
		    logeventf(ssh, "Local port %.*s%.*s%.*s%.*s%d%.*s"
			      " forwarding to %s:%.*s%.*s%d%.*s",
			      (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL,
			      (int)(*saddr?1:0), ":",
			      (int)(sserv ? strlen(sports) : 0), sports,
			      sserv, "(", sport, sserv, ")",
			      host,
			      (int)(dserv ? strlen(dports) : 0), dports,
			      dserv, "(", dport, dserv, ")");
		} else {
		    struct ssh_rportfwd *pf;
		    pf = smalloc(sizeof(*pf));
		    strcpy(pf->dhost, host);
		    pf->dport = dport;
		    if (saddr) {
			logeventf(ssh,
				  "SSH1 cannot handle source address spec \"%s:%d\"; ignoring",
				  saddr, sport);
		    }
		    if (add234(ssh->rportfwds, pf) != pf) {
			logeventf(ssh, 
				  "Duplicate remote port forwarding to %s:%d",
				  host, dport);
			sfree(pf);
		    } else {
			logeventf(ssh, "Requesting remote port %.*s%.*s%d%.*s"
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111

5112
5113














5114

5115
5116
5117
5118
5119
5120

5121
5122
5123
5124
5125
5126

5127
5128
5129
5130
5131
5132
5133
    /*
     * Enable port forwardings.
     */
    {
	char type;
	int n;
	int sport,dport,sserv,dserv;
	char sports[256], dports[256], host[256];

	ssh->rportfwds = newtree234(ssh_rportcmp_ssh2);
        /* Add port forwardings. */
	ssh->portfwd_strptr = cfg.portfwd;
	while (*ssh->portfwd_strptr) {
	    type = *ssh->portfwd_strptr++;

	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t')














		sports[n++] = *ssh->portfwd_strptr++;

	    sports[n] = 0;
	    if (*ssh->portfwd_strptr == '\t')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':')
		host[n++] = *ssh->portfwd_strptr++;

	    host[n] = 0;
	    if (*ssh->portfwd_strptr == ':')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr)
		dports[n++] = *ssh->portfwd_strptr++;

	    dports[n] = 0;
	    ssh->portfwd_strptr++;
	    dport = atoi(dports);
	    dserv = 0;
	    if (dport == 0) {
		dserv = 1;
		dport = net_service_lookup(dports);







|






>

|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>




|
|
>




|
|
>







5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
    /*
     * Enable port forwardings.
     */
    {
	char type;
	int n;
	int sport,dport,sserv,dserv;
	char sports[256], dports[256], saddr[256], host[256];

	ssh->rportfwds = newtree234(ssh_rportcmp_ssh2);
        /* Add port forwardings. */
	ssh->portfwd_strptr = cfg.portfwd;
	while (*ssh->portfwd_strptr) {
	    type = *ssh->portfwd_strptr++;
	    saddr[0] = '\0';
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != '\t') {
		if (*ssh->portfwd_strptr == ':') {
		    /*
		     * We've seen a colon in the middle of the
		     * source port number. This means that
		     * everything we've seen until now is the
		     * source _address_, so we'll move it into
		     * saddr and start sports from the beginning
		     * again.
		     */
		    ssh->portfwd_strptr++;
		    sports[n] = '\0';
		    strcpy(saddr, sports);
		    n = 0;
		}
		if (n < 255) sports[n++] = *ssh->portfwd_strptr++;
	    }
	    sports[n] = 0;
	    if (*ssh->portfwd_strptr == '\t')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr && *ssh->portfwd_strptr != ':') {
		if (n < 255) host[n++] = *ssh->portfwd_strptr++;
	    }
	    host[n] = 0;
	    if (*ssh->portfwd_strptr == ':')
		ssh->portfwd_strptr++;
	    n = 0;
	    while (*ssh->portfwd_strptr) {
		if (n < 255) dports[n++] = *ssh->portfwd_strptr++;
	    }
	    dports[n] = 0;
	    ssh->portfwd_strptr++;
	    dport = atoi(dports);
	    dserv = 0;
	    if (dport == 0) {
		dserv = 1;
		dport = net_service_lookup(dports);
5144
5145
5146
5147
5148
5149
5150
5151

5152
5153


5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170

5171



5172
5173
5174
5175
5176
5177
5178
5179


5180
5181
5182
5183
5184
5185
5186
		if (!sport) {
		    logeventf(ssh, "Service lookup failed for source"
			      " port \"%s\"", sports);
		}
	    }
	    if (sport && dport) {
		if (type == 'L') {
		    pfd_addforward(host, dport, sport, ssh);

		    logeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to"
			      " %s:%.*s%.*s%d%.*s",


			      (int)(sserv ? strlen(sports) : 0), sports,
			      sserv, "(", sport, sserv, ")",
			      host,
			      (int)(dserv ? strlen(dports) : 0), dports,
			      dserv, "(", dport, dserv, ")");
		} else {
		    struct ssh_rportfwd *pf;
		    pf = smalloc(sizeof(*pf));
		    strcpy(pf->dhost, host);
		    pf->dport = dport;
		    pf->sport = sport;
		    if (add234(ssh->rportfwds, pf) != pf) {
			logeventf(ssh, "Duplicate remote port forwarding"
				  " to %s:%d", host, dport);
			sfree(pf);
		    } else {
			logeventf(ssh, "Requesting remote port %.*s%.*s%d%.*s"

				  " forward to %s:%.*s%.*s%d%.*s",



				  (int)(sserv ? strlen(sports) : 0), sports,
				  sserv, "(", sport, sserv, ")",
				  host,
				  (int)(dserv ? strlen(dports) : 0), dports,
				  dserv, "(", dport, dserv, ")");
			ssh2_pkt_init(ssh, SSH2_MSG_GLOBAL_REQUEST);
			ssh2_pkt_addstring(ssh, "tcpip-forward");
			ssh2_pkt_addbool(ssh, 1);/* want reply */


			if (cfg.rport_acceptall)
			    ssh2_pkt_addstring(ssh, "0.0.0.0");
			else
			    ssh2_pkt_addstring(ssh, "127.0.0.1");
			ssh2_pkt_adduint32(ssh, sport);
			ssh2_pkt_send(ssh);








|
>
|
|
>
>
















|
>

>
>
>








>
>







5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
		if (!sport) {
		    logeventf(ssh, "Service lookup failed for source"
			      " port \"%s\"", sports);
		}
	    }
	    if (sport && dport) {
		if (type == 'L') {
		    pfd_addforward(host, dport, *saddr ? saddr : NULL,
				   sport, ssh);
		    logeventf(ssh, "Local port %.*s%.*s%.*s%.*s%d%.*s"
			      " forwarding to %s:%.*s%.*s%d%.*s",
			      (int)(*saddr?strlen(saddr):0), *saddr?saddr:NULL,
			      (int)(*saddr?1:0), ":",
			      (int)(sserv ? strlen(sports) : 0), sports,
			      sserv, "(", sport, sserv, ")",
			      host,
			      (int)(dserv ? strlen(dports) : 0), dports,
			      dserv, "(", dport, dserv, ")");
		} else {
		    struct ssh_rportfwd *pf;
		    pf = smalloc(sizeof(*pf));
		    strcpy(pf->dhost, host);
		    pf->dport = dport;
		    pf->sport = sport;
		    if (add234(ssh->rportfwds, pf) != pf) {
			logeventf(ssh, "Duplicate remote port forwarding"
				  " to %s:%d", host, dport);
			sfree(pf);
		    } else {
			logeventf(ssh, "Requesting remote port "
				  "%.*s%.*s%.*s%.*s%d%.*s"
				  " forward to %s:%.*s%.*s%d%.*s",
				  (int)(*saddr?strlen(saddr):0),
				  *saddr?saddr:NULL,
				  (int)(*saddr?1:0), ":",
				  (int)(sserv ? strlen(sports) : 0), sports,
				  sserv, "(", sport, sserv, ")",
				  host,
				  (int)(dserv ? strlen(dports) : 0), dports,
				  dserv, "(", dport, dserv, ")");
			ssh2_pkt_init(ssh, SSH2_MSG_GLOBAL_REQUEST);
			ssh2_pkt_addstring(ssh, "tcpip-forward");
			ssh2_pkt_addbool(ssh, 1);/* want reply */
			if (*saddr)
			    ssh2_pkt_addstring(ssh, saddr);
			if (cfg.rport_acceptall)
			    ssh2_pkt_addstring(ssh, "0.0.0.0");
			else
			    ssh2_pkt_addstring(ssh, "127.0.0.1");
			ssh2_pkt_adduint32(ssh, sport);
			ssh2_pkt_send(ssh);