X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/c2524e4ee3ee57fd5b3b6d44a2026ee742573c3d..1d81a7b61a209e7ab114d4aadd4e9a8b318f83dc:/ssh.c diff --git a/ssh.c b/ssh.c index dde5bfab..4537f38f 100644 --- a/ssh.c +++ b/ssh.c @@ -2055,7 +2055,7 @@ static char *connect_to_host(Ssh ssh, char *host, int port, * Try to find host. */ logeventf(ssh, "Looking up host \"%s\"", host); - addr = name_lookup(host, port, realhost); + addr = name_lookup(host, port, realhost, &ssh->cfg); if ((err = sk_addr_error(addr)) != NULL) return err; @@ -2068,7 +2068,8 @@ static char *connect_to_host(Ssh ssh, char *host, int port, logeventf(ssh, "Connecting to %s port %d", addrbuf, port); } ssh->fn = &fn_table; - ssh->s = new_connection(addr, *realhost, port, 0, 1, nodelay, (Plug) ssh); + ssh->s = new_connection(addr, *realhost, port, + 0, 1, nodelay, (Plug) ssh, &ssh->cfg); if ((err = sk_socket_error(ssh->s)) != NULL) { ssh->s = NULL; return err; @@ -3121,7 +3122,7 @@ static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, int ispkt) if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, *saddr ? saddr : NULL, - sport, ssh, ssh->cfg.lport_acceptall); + sport, ssh, &ssh->cfg); 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, @@ -3285,7 +3286,7 @@ static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, int ispkt) c->ssh = ssh; if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c, - ssh->x11auth, NULL, -1) != NULL) { + ssh->x11auth, NULL, -1, &ssh->cfg) != NULL) { logevent("opening X11 forward connection failed"); sfree(c); send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE, @@ -3363,7 +3364,7 @@ static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, int ispkt) sprintf(buf, "Received remote port open request for %s:%d", host, port); logevent(buf); - e = pfd_newconnect(&c->u.pfd.s, host, port, c); + e = pfd_newconnect(&c->u.pfd.s, host, port, c, &ssh->cfg); if (e != NULL) { char buf[256]; sprintf(buf, "Port open failed: %s", e); @@ -4030,6 +4031,7 @@ static int do_ssh2_transport(Ssh ssh, unsigned char *in, int inlen, int ispkt) SHA_Final(&ssh->exhash, s->exchange_hash); dh_cleanup(ssh->kex_ctx); + ssh->kex_ctx = NULL; #if 0 debug(("Exchange hash is:\n")); @@ -5185,7 +5187,7 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt) if (sport && dport) { if (type == 'L') { pfd_addforward(host, dport, *saddr ? saddr : NULL, - sport, ssh, ssh->cfg.lport_acceptall); + sport, ssh, &ssh->cfg); 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, @@ -5746,7 +5748,8 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt) 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, port) != NULL) { + ssh->x11auth, addrstr, port, + &ssh->cfg) != NULL) { error = "Unable to open an X11 connection"; } else { c->type = CHAN_X11; @@ -5765,7 +5768,7 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt) error = "Remote port is not recognised"; } else { char *e = pfd_newconnect(&c->u.pfd.s, realpf->dhost, - realpf->dport, c); + realpf->dport, c, &ssh->cfg); logeventf(ssh, "Received remote port open request" " for %s:%d", realpf->dhost, realpf->dport); if (e != NULL) { @@ -5900,6 +5903,7 @@ static char *ssh_init(void *frontend_handle, void **backend_handle, ssh->sccomp = NULL; ssh->sc_comp_ctx = NULL; ssh->kex = NULL; + ssh->kex_ctx = NULL; ssh->hostkey = NULL; ssh->exitcode = -1; ssh->state = SSH_STATE_PREPACKET; @@ -5946,6 +5950,9 @@ static char *ssh_init(void *frontend_handle, void **backend_handle, ssh->term_width = ssh->cfg.width; ssh->term_height = ssh->cfg.height; + ssh->channels = NULL; + ssh->rportfwds = NULL; + ssh->send_ok = 0; ssh->editing = 0; ssh->echoing = 0; @@ -5962,6 +5969,65 @@ static char *ssh_init(void *frontend_handle, void **backend_handle, return NULL; } +static void ssh_free(void *handle) +{ + Ssh ssh = (Ssh) handle; + struct ssh_channel *c; + struct ssh_rportfwd *pf; + + if (ssh->v1_cipher_ctx) + ssh->cipher->free_context(ssh->v1_cipher_ctx); + if (ssh->cs_cipher_ctx) + ssh->cscipher->free_context(ssh->cs_cipher_ctx); + if (ssh->sc_cipher_ctx) + ssh->sccipher->free_context(ssh->sc_cipher_ctx); + if (ssh->cs_mac_ctx) + ssh->csmac->free_context(ssh->cs_mac_ctx); + if (ssh->sc_mac_ctx) + ssh->scmac->free_context(ssh->sc_mac_ctx); + if (ssh->cs_comp_ctx) + ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx); + if (ssh->sc_comp_ctx) + ssh->sccomp->compress_cleanup(ssh->sc_comp_ctx); + if (ssh->kex_ctx) + dh_cleanup(ssh->kex_ctx); + sfree(ssh->savedhost); + + if (ssh->channels) { + while ((c = delpos234(ssh->channels, 0)) != NULL) { + switch (c->type) { + case CHAN_X11: + if (c->u.x11.s != NULL) + x11_close(c->u.x11.s); + break; + case CHAN_SOCKDATA: + if (c->u.pfd.s != NULL) + pfd_close(c->u.pfd.s); + break; + } + sfree(c); + } + freetree234(ssh->channels); + } + + if (ssh->rportfwds) { + while ((pf = delpos234(ssh->rportfwds, 0)) != NULL) + sfree(pf); + freetree234(ssh->rportfwds); + } + sfree(ssh->deferred_send_data); + if (ssh->x11auth) + x11_free_auth(ssh->x11auth); + sfree(ssh->do_ssh_init_state); + sfree(ssh->do_ssh1_login_state); + sfree(ssh->do_ssh2_transport_state); + sfree(ssh->do_ssh2_authconn_state); + + if (ssh->s) + sk_close(ssh->s); + sfree(ssh); +} + /* * Reconfigure the SSH backend. * @@ -6234,6 +6300,7 @@ extern int ssh_fallback_cmd(void *handle) Backend ssh_backend = { ssh_init, + ssh_free, ssh_reconfig, ssh_send, ssh_sendbuffer,