1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-19 03:58:05 -05:00

Rename the various ssh2_maybe_setup_* functions to ssh2_setup_*, and

move the primary conditions out of them into their callers. Fixes a
crash in 'plink -N', since those functions would be called with a NULL
channel parameter and immediately dereference it to try to get c->ssh.

[originally from svn r9644]
This commit is contained in:
Simon Tatham 2012-08-30 18:44:35 +00:00
parent dbc8ea8e35
commit b631c1e18e

60
ssh.c
View File

@ -7468,27 +7468,21 @@ static void ssh2_send_ttymode(void *data, char *mode, char *val)
ssh2_pkt_adduint32(pktout, arg); ssh2_pkt_adduint32(pktout, arg);
} }
static void ssh2_maybe_setup_x11(struct ssh_channel *c, struct Packet *pktin, static void ssh2_setup_x11(struct ssh_channel *c, struct Packet *pktin,
void *ctx) void *ctx)
{ {
struct ssh2_maybe_setup_x11_state { struct ssh2_setup_x11_state {
int crLine; int crLine;
}; };
Ssh ssh = c->ssh; Ssh ssh = c->ssh;
struct Packet *pktout; struct Packet *pktout;
crStateP(ssh2_maybe_setup_x11_state, ctx); crStateP(ssh2_setup_x11_state, ctx);
crBeginState; crBeginState;
/*
* Potentially enable X11 forwarding.
*/
if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_x11_forward) &&
(ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display),
conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf))) {
logevent("Requesting X11 forwarding"); logevent("Requesting X11 forwarding");
pktout = ssh2_chanreq_init(ssh->mainchan, "x11-req", pktout = ssh2_chanreq_init(ssh->mainchan, "x11-req",
ssh2_maybe_setup_x11, s); ssh2_setup_x11, s);
ssh2_pkt_addbool(pktout, 0); /* many connections */ ssh2_pkt_addbool(pktout, 0); /* many connections */
ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthprotoname); ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthprotoname);
/* /*
@ -7513,26 +7507,25 @@ static void ssh2_maybe_setup_x11(struct ssh_channel *c, struct Packet *pktin,
} else } else
logevent("X11 forwarding refused"); logevent("X11 forwarding refused");
} }
}
crFinishFreeV; crFinishFreeV;
} }
static void ssh2_maybe_setup_agent(struct ssh_channel *c, struct Packet *pktin, static void ssh2_setup_agent(struct ssh_channel *c, struct Packet *pktin,
void *ctx) void *ctx)
{ {
struct ssh2_maybe_setup_agent_state { struct ssh2_setup_agent_state {
int crLine; int crLine;
}; };
Ssh ssh = c->ssh; Ssh ssh = c->ssh;
struct Packet *pktout; struct Packet *pktout;
crStateP(ssh2_maybe_setup_agent_state, ctx); crStateP(ssh2_setup_agent_state, ctx);
crBeginState; crBeginState;
if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists()) {
logevent("Requesting OpenSSH-style agent forwarding"); logevent("Requesting OpenSSH-style agent forwarding");
pktout = ssh2_chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com", pktout = ssh2_chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com",
ssh2_maybe_setup_agent, s); ssh2_setup_agent, s);
ssh2_pkt_send(ssh, pktout); ssh2_pkt_send(ssh, pktout);
crWaitUntilV(pktin); crWaitUntilV(pktin);
@ -7544,30 +7537,29 @@ static void ssh2_maybe_setup_agent(struct ssh_channel *c, struct Packet *pktin,
} else } else
logevent("Agent forwarding refused"); logevent("Agent forwarding refused");
} }
}
crFinishFreeV; crFinishFreeV;
} }
static void ssh2_maybe_setup_pty(struct ssh_channel *c, struct Packet *pktin, static void ssh2_setup_pty(struct ssh_channel *c, struct Packet *pktin,
void *ctx) void *ctx)
{ {
struct ssh2_maybe_setup_pty_state { struct ssh2_setup_pty_state {
int crLine; int crLine;
}; };
Ssh ssh = c->ssh; Ssh ssh = c->ssh;
struct Packet *pktout; struct Packet *pktout;
crStateP(ssh2_maybe_setup_pty_state, ctx); crStateP(ssh2_setup_pty_state, ctx);
crBeginState; crBeginState;
if (ssh->mainchan && !ssh->ncmode && !conf_get_int(ssh->conf, CONF_nopty)) {
/* Unpick the terminal-speed string. */ /* Unpick the terminal-speed string. */
/* XXX perhaps we should allow no speeds to be sent. */ /* XXX perhaps we should allow no speeds to be sent. */
ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */ ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
sscanf(conf_get_str(ssh->conf, CONF_termspeed), "%d,%d", &ssh->ospeed, &ssh->ispeed); sscanf(conf_get_str(ssh->conf, CONF_termspeed), "%d,%d", &ssh->ospeed, &ssh->ispeed);
/* Build the pty request. */ /* Build the pty request. */
pktout = ssh2_chanreq_init(ssh->mainchan, "pty-req", pktout = ssh2_chanreq_init(ssh->mainchan, "pty-req",
ssh2_maybe_setup_pty, s); ssh2_setup_pty, s);
ssh2_pkt_addstring(pktout, conf_get_str(ssh->conf, CONF_termtype)); ssh2_pkt_addstring(pktout, conf_get_str(ssh->conf, CONF_termtype));
ssh2_pkt_adduint32(pktout, ssh->term_width); ssh2_pkt_adduint32(pktout, ssh->term_width);
ssh2_pkt_adduint32(pktout, ssh->term_height); ssh2_pkt_adduint32(pktout, ssh->term_height);
@ -7595,9 +7587,7 @@ static void ssh2_maybe_setup_pty(struct ssh_channel *c, struct Packet *pktin,
ssh->editing = ssh->echoing = 1; ssh->editing = ssh->echoing = 1;
} }
} }
} else {
ssh->editing = ssh->echoing = 1;
}
crFinishFreeV; crFinishFreeV;
} }
@ -7621,7 +7611,7 @@ static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin,
* then wait for a whole bunch of successes or failures. * then wait for a whole bunch of successes or failures.
*/ */
s->num_env = 0; s->num_env = 0;
if (ssh->mainchan && !ssh->ncmode) { {
char *key, *val; char *key, *val;
for (val = conf_get_str_strs(ssh->conf, CONF_environmt, NULL, &key); for (val = conf_get_str_strs(ssh->conf, CONF_environmt, NULL, &key);
@ -9244,21 +9234,33 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
/* /*
* Potentially enable X11 forwarding. * Potentially enable X11 forwarding.
*/ */
ssh2_maybe_setup_x11(ssh->mainchan, NULL, NULL); /*
* Potentially enable X11 forwarding.
*/
if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_x11_forward) &&
(ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display),
conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf)))
ssh2_setup_x11(ssh->mainchan, NULL, NULL);
/* /*
* Potentially enable agent forwarding. * Potentially enable agent forwarding.
*/ */
ssh2_maybe_setup_agent(ssh->mainchan, NULL, NULL); if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists())
ssh2_setup_agent(ssh->mainchan, NULL, NULL);
/* /*
* Now allocate a pty for the session. * Now allocate a pty for the session.
*/ */
ssh2_maybe_setup_pty(ssh->mainchan, NULL, NULL); if (ssh->mainchan && !ssh->ncmode && !conf_get_int(ssh->conf, CONF_nopty)) {
ssh2_setup_pty(ssh->mainchan, NULL, NULL);
} else {
ssh->editing = ssh->echoing = 1;
}
/* /*
* Send environment variables. * Send environment variables.
*/ */
if (ssh->mainchan && !ssh->ncmode)
ssh2_setup_env(ssh->mainchan, NULL, NULL); ssh2_setup_env(ssh->mainchan, NULL, NULL);
/* /*