* 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;
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;
if (sport && dport) {
if (type == 'L') {
pfd_addforward(host, dport, *saddr ? saddr : NULL,
- sport, ssh);
+ 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,
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,
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);
SHA_Final(&ssh->exhash, s->exchange_hash);
dh_cleanup(ssh->kex_ctx);
+ ssh->kex_ctx = NULL;
#if 0
debug(("Exchange hash is:\n"));
if (sport && dport) {
if (type == 'L') {
pfd_addforward(host, dport, *saddr ? saddr : NULL,
- sport, ssh);
+ 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,
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;
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) {
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;
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;
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.
*
Backend ssh_backend = {
ssh_init,
+ ssh_free,
ssh_reconfig,
ssh_send,
ssh_sendbuffer,