Diff

Differences From Artifact [fcbded294e]:

To Artifact [0b4ba5824c]:


295
296
297
298
299
300
301
302
303


304
305
306
307
308
309
310
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 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
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], host[256];
	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')
		sports[n++] = *ssh->portfwd_strptr++;
	    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 != ':')
		host[n++] = *ssh->portfwd_strptr++;
	    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)
		dports[n++] = *ssh->portfwd_strptr++;
	    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
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, sport, ssh);
		    logeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to"
			      " %s:%.*s%.*s%d%.*s",
		    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
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], host[256];
	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')
		sports[n++] = *ssh->portfwd_strptr++;
	    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 != ':')
		host[n++] = *ssh->portfwd_strptr++;
	    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)
		dports[n++] = *ssh->portfwd_strptr++;
	    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
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, sport, ssh);
		    logeventf(ssh, "Local port %.*s%.*s%d%.*s forwarding to"
			      " %s:%.*s%.*s%d%.*s",
		    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%d%.*s"
			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);