mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05:00
Clean up the semantics of the ssh_rportfwd structure.
It's now indexed by source hostname as well as source port (so that separate requests for the server to listen on addr1:1234 and addr2:1234 can be disambiguated), and also its destination host name is dynamically allocated rather than a fixed-size buffer. [originally from svn r10062]
This commit is contained in:
parent
c4833bae5a
commit
5ecb7d7f1d
58
ssh.c
58
ssh.c
@ -708,12 +708,20 @@ struct ssh_portfwd; /* forward declaration */
|
|||||||
|
|
||||||
struct ssh_rportfwd {
|
struct ssh_rportfwd {
|
||||||
unsigned sport, dport;
|
unsigned sport, dport;
|
||||||
char dhost[256];
|
char *shost, *dhost;
|
||||||
char *sportdesc;
|
char *sportdesc;
|
||||||
struct ssh_portfwd *pfrec;
|
struct ssh_portfwd *pfrec;
|
||||||
};
|
};
|
||||||
#define free_rportfwd(pf) ( \
|
|
||||||
((pf) ? (sfree((pf)->sportdesc)) : (void)0 ), sfree(pf) )
|
static void free_rportfwd(struct ssh_rportfwd *pf)
|
||||||
|
{
|
||||||
|
if (pf) {
|
||||||
|
sfree(pf->sportdesc);
|
||||||
|
sfree(pf->shost);
|
||||||
|
sfree(pf->dhost);
|
||||||
|
sfree(pf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Separately to the rportfwd tree (which is for looking up port
|
* Separately to the rportfwd tree (which is for looking up port
|
||||||
@ -1107,7 +1115,9 @@ static int ssh_rportcmp_ssh2(void *av, void *bv)
|
|||||||
{
|
{
|
||||||
struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
|
struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
|
||||||
struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
|
struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
|
||||||
|
int i;
|
||||||
|
if ( (i = strcmp(a->shost, b->shost)) != 0)
|
||||||
|
return i < 0 ? -1 : +1;
|
||||||
if (a->sport > b->sport)
|
if (a->sport > b->sport)
|
||||||
return +1;
|
return +1;
|
||||||
if (a->sport < b->sport)
|
if (a->sport < b->sport)
|
||||||
@ -4725,9 +4735,15 @@ static void ssh_setup_portfwd(Ssh ssh, Conf *conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pf = snew(struct ssh_rportfwd);
|
pf = snew(struct ssh_rportfwd);
|
||||||
strncpy(pf->dhost, epf->daddr, lenof(pf->dhost)-1);
|
pf->dhost = dupstr(epf->daddr);
|
||||||
pf->dhost[lenof(pf->dhost)-1] = '\0';
|
|
||||||
pf->dport = epf->dport;
|
pf->dport = epf->dport;
|
||||||
|
if (epf->saddr) {
|
||||||
|
pf->shost = dupstr(epf->saddr);
|
||||||
|
} else if (conf_get_int(conf, CONF_rport_acceptall)) {
|
||||||
|
pf->shost = dupstr("");
|
||||||
|
} else {
|
||||||
|
pf->shost = dupstr("localhost");
|
||||||
|
}
|
||||||
pf->sport = epf->sport;
|
pf->sport = epf->sport;
|
||||||
if (add234(ssh->rportfwds, pf) != pf) {
|
if (add234(ssh->rportfwds, pf) != pf) {
|
||||||
logeventf(ssh, "Duplicate remote port forwarding to %s:%d",
|
logeventf(ssh, "Duplicate remote port forwarding to %s:%d",
|
||||||
@ -4756,14 +4772,8 @@ static void ssh_setup_portfwd(Ssh ssh, Conf *conf)
|
|||||||
pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
|
pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
|
||||||
ssh2_pkt_addstring(pktout, "tcpip-forward");
|
ssh2_pkt_addstring(pktout, "tcpip-forward");
|
||||||
ssh2_pkt_addbool(pktout, 1);/* want reply */
|
ssh2_pkt_addbool(pktout, 1);/* want reply */
|
||||||
if (epf->saddr) {
|
ssh2_pkt_addstring(pktout, pf->shost);
|
||||||
ssh2_pkt_addstring(pktout, epf->saddr);
|
ssh2_pkt_adduint32(pktout, pf->sport);
|
||||||
} else if (conf_get_int(conf, CONF_rport_acceptall)) {
|
|
||||||
ssh2_pkt_addstring(pktout, "");
|
|
||||||
} else {
|
|
||||||
ssh2_pkt_addstring(pktout, "localhost");
|
|
||||||
}
|
|
||||||
ssh2_pkt_adduint32(pktout, epf->sport);
|
|
||||||
ssh2_pkt_send(ssh, pktout);
|
ssh2_pkt_send(ssh, pktout);
|
||||||
|
|
||||||
ssh_queue_handler(ssh, SSH2_MSG_REQUEST_SUCCESS,
|
ssh_queue_handler(ssh, SSH2_MSG_REQUEST_SUCCESS,
|
||||||
@ -4883,10 +4893,7 @@ static void ssh1_msg_port_open(Ssh ssh, struct Packet *pktin)
|
|||||||
ssh_pkt_getstring(pktin, &host, &hostsize);
|
ssh_pkt_getstring(pktin, &host, &hostsize);
|
||||||
port = ssh_pkt_getuint32(pktin);
|
port = ssh_pkt_getuint32(pktin);
|
||||||
|
|
||||||
if (hostsize >= lenof(pf.dhost))
|
pf.dhost = dupprintf(".*s", hostsize, host);
|
||||||
hostsize = lenof(pf.dhost)-1;
|
|
||||||
memcpy(pf.dhost, host, hostsize);
|
|
||||||
pf.dhost[hostsize] = '\0';
|
|
||||||
pf.dport = port;
|
pf.dport = port;
|
||||||
pfp = find234(ssh->rportfwds, &pf, NULL);
|
pfp = find234(ssh->rportfwds, &pf, NULL);
|
||||||
|
|
||||||
@ -4923,6 +4930,8 @@ static void ssh1_msg_port_open(Ssh ssh, struct Packet *pktin)
|
|||||||
logevent("Forwarded port opened successfully");
|
logevent("Forwarded port opened successfully");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sfree(pf.dhost);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ssh1_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
|
static void ssh1_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
|
||||||
@ -7511,15 +7520,18 @@ static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
|
|||||||
} else if (typelen == 15 &&
|
} else if (typelen == 15 &&
|
||||||
!memcmp(type, "forwarded-tcpip", 15)) {
|
!memcmp(type, "forwarded-tcpip", 15)) {
|
||||||
struct ssh_rportfwd pf, *realpf;
|
struct ssh_rportfwd pf, *realpf;
|
||||||
char *dummy;
|
char *shost;
|
||||||
int dummylen;
|
int shostlen;
|
||||||
ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */
|
ssh_pkt_getstring(pktin, &shost, &shostlen);/* skip address */
|
||||||
|
pf.shost = dupprintf("%.*s", shostlen, shost);
|
||||||
pf.sport = ssh_pkt_getuint32(pktin);
|
pf.sport = ssh_pkt_getuint32(pktin);
|
||||||
ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
|
ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
|
||||||
peerport = ssh_pkt_getuint32(pktin);
|
peerport = ssh_pkt_getuint32(pktin);
|
||||||
realpf = find234(ssh->rportfwds, &pf, NULL);
|
realpf = find234(ssh->rportfwds, &pf, NULL);
|
||||||
logeventf(ssh, "Received remote port %d open request "
|
logeventf(ssh, "Received remote port %s:%d open request "
|
||||||
"from %s:%d", pf.sport, peeraddr, peerport);
|
"from %s:%d", pf.shost, pf.sport, peeraddr, peerport);
|
||||||
|
sfree(pf.shost);
|
||||||
|
|
||||||
if (realpf == NULL) {
|
if (realpf == NULL) {
|
||||||
error = "Remote port is not recognised";
|
error = "Remote port is not recognised";
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user