1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 09:12:24 +00:00

Merge branch 'pre-0.64'

This commit is contained in:
Simon Tatham 2014-11-22 16:02:01 +00:00
commit d870b5650e
8 changed files with 45 additions and 4 deletions

View File

@ -381,6 +381,7 @@ union control *ctrl_droplist(struct controlset *s, char *label, char shortcut,
c->listbox.percentwidth = percentage; c->listbox.percentwidth = percentage;
c->listbox.ncols = 0; c->listbox.ncols = 0;
c->listbox.percentages = NULL; c->listbox.percentages = NULL;
c->listbox.hscroll = FALSE;
return c; return c;
} }
@ -397,6 +398,7 @@ union control *ctrl_draglist(struct controlset *s,char *label,char shortcut,
c->listbox.percentwidth = 100; c->listbox.percentwidth = 100;
c->listbox.ncols = 0; c->listbox.ncols = 0;
c->listbox.percentages = NULL; c->listbox.percentages = NULL;
c->listbox.hscroll = FALSE;
return c; return c;
} }

14
ldisc.c
View File

@ -7,6 +7,7 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <assert.h>
#include "putty.h" #include "putty.h"
#include "terminal.h" #include "terminal.h"
@ -139,6 +140,17 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
ldisc_update(ldisc->frontend, ECHOING, EDITING); ldisc_update(ldisc->frontend, ECHOING, EDITING);
return; return;
} }
/*
* If that wasn't true, then we expect ldisc->term to be non-NULL
* hereafter. (The only front ends which have an ldisc but no term
* are those which do networking but no terminal emulation, in
* which case they need the above if statement to handle
* ldisc_updates passed from the back ends, but should never send
* any actual input through this function.)
*/
assert(ldisc->term);
/* /*
* Notify the front end that something was pressed, in case * Notify the front end that something was pressed, in case
* it's depending on finding out (e.g. keypress termination for * it's depending on finding out (e.g. keypress termination for
@ -146,7 +158,7 @@ void ldisc_send(void *handle, char *buf, int len, int interactive)
*/ */
frontend_keypress(ldisc->frontend); frontend_keypress(ldisc->frontend);
if (interactive && ldisc->term) { if (interactive) {
/* /*
* Interrupt a paste from the clipboard, if one was in * Interrupt a paste from the clipboard, if one was in
* progress when the user pressed a key. This is easier than * progress when the user pressed a key. This is easier than

2
misc.c
View File

@ -943,7 +943,7 @@ int validate_manual_hostkey(char *key)
while ((p += strspn(p, " \t"))[0]) { while ((p += strspn(p, " \t"))[0]) {
q = p; q = p;
p += strcspn(p, " \t"); p += strcspn(p, " \t");
if (p) *p++ = '\0'; if (*p) *p++ = '\0';
/* /*
* Now q is our word. * Now q is our word.

5
ssh.c
View File

@ -3873,6 +3873,7 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
s->dlgret = verify_ssh_manual_host_key(ssh, fingerprint, NULL, NULL); s->dlgret = verify_ssh_manual_host_key(ssh, fingerprint, NULL, NULL);
if (s->dlgret == 0) { /* did not match */ if (s->dlgret == 0) { /* did not match */
bombout(("Host key did not appear in manually configured list")); bombout(("Host key did not appear in manually configured list"));
sfree(keystr);
crStop(0); crStop(0);
} else if (s->dlgret < 0) { /* none configured; use standard handling */ } else if (s->dlgret < 0) { /* none configured; use standard handling */
ssh_set_frozen(ssh, 1); ssh_set_frozen(ssh, 1);
@ -3899,6 +3900,8 @@ static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
NULL, 0, TRUE); NULL, 0, TRUE);
crStop(0); crStop(0);
} }
} else {
sfree(keystr);
} }
} }
@ -10675,6 +10678,8 @@ static const char *ssh_init(void *frontend_handle, void **backend_handle,
ssh->sent_console_eof = FALSE; ssh->sent_console_eof = FALSE;
ssh->got_pty = FALSE; ssh->got_pty = FALSE;
ssh->bare_connection = FALSE; ssh->bare_connection = FALSE;
ssh->X11_fwd_enabled = FALSE;
ssh->connshare = NULL;
ssh->attempting_connshare = FALSE; ssh->attempting_connshare = FALSE;
*backend_handle = ssh; *backend_handle = ssh;

View File

@ -857,6 +857,7 @@ static void share_try_cleanup(struct ssh_sharing_connstate *cs)
SSH2_MSG_GLOBAL_REQUEST, SSH2_MSG_GLOBAL_REQUEST,
packet, pos, "cleanup after" packet, pos, "cleanup after"
" downstream went away"); " downstream went away");
sfree(packet);
share_remove_forwarding(cs, fwd); share_remove_forwarding(cs, fwd);
i--; /* don't accidentally skip one as a result */ i--; /* don't accidentally skip one as a result */
@ -1594,6 +1595,9 @@ static void share_got_pkt_from_downstream(struct ssh_sharing_connstate *cs,
!ssh_agent_forwarding_permitted(cs->parent->ssh)) { !ssh_agent_forwarding_permitted(cs->parent->ssh)) {
unsigned server_id = GET_32BIT(pkt); unsigned server_id = GET_32BIT(pkt);
unsigned char recipient_id[4]; unsigned char recipient_id[4];
sfree(request_name);
chan = share_find_channel_by_server(cs, server_id); chan = share_find_channel_by_server(cs, server_id);
if (chan) { if (chan) {
PUT_32BIT(recipient_id, chan->downstream_id); PUT_32BIT(recipient_id, chan->downstream_id);
@ -1625,6 +1629,8 @@ static void share_got_pkt_from_downstream(struct ssh_sharing_connstate *cs,
int auth_proto, protolen, datalen; int auth_proto, protolen, datalen;
int pos; int pos;
sfree(request_name);
chan = share_find_channel_by_server(cs, server_id); chan = share_find_channel_by_server(cs, server_id);
if (!chan) { if (!chan) {
char *buf = dupprintf("X11 forwarding request for " char *buf = dupprintf("X11 forwarding request for "
@ -1646,16 +1652,19 @@ static void share_got_pkt_from_downstream(struct ssh_sharing_connstate *cs,
want_reply = pkt[15] != 0; want_reply = pkt[15] != 0;
single_connection = pkt[16] != 0; single_connection = pkt[16] != 0;
auth_proto_str = getstring(pkt+17, pktlen-17); auth_proto_str = getstring(pkt+17, pktlen-17);
auth_proto = x11_identify_auth_proto(auth_proto_str);
sfree(auth_proto_str);
pos = 17 + getstring_size(pkt+17, pktlen-17); pos = 17 + getstring_size(pkt+17, pktlen-17);
auth_data = getstring(pkt+pos, pktlen-pos); auth_data = getstring(pkt+pos, pktlen-pos);
pos += getstring_size(pkt+pos, pktlen-pos); pos += getstring_size(pkt+pos, pktlen-pos);
if (pktlen < pos+4) { if (pktlen < pos+4) {
err = dupprintf("Truncated CHANNEL_REQUEST(\"x11\") packet"); err = dupprintf("Truncated CHANNEL_REQUEST(\"x11\") packet");
sfree(auth_data);
goto confused; goto confused;
} }
screen = GET_32BIT(pkt+pos); screen = GET_32BIT(pkt+pos);
auth_proto = x11_identify_auth_proto(auth_proto_str);
if (auth_proto < 0) { if (auth_proto < 0) {
/* Reject due to not understanding downstream's /* Reject due to not understanding downstream's
* requested authorisation method. */ * requested authorisation method. */
@ -1663,11 +1672,14 @@ static void share_got_pkt_from_downstream(struct ssh_sharing_connstate *cs,
PUT_32BIT(recipient_id, chan->downstream_id); PUT_32BIT(recipient_id, chan->downstream_id);
send_packet_to_downstream(cs, SSH2_MSG_CHANNEL_FAILURE, send_packet_to_downstream(cs, SSH2_MSG_CHANNEL_FAILURE,
recipient_id, 4, NULL); recipient_id, 4, NULL);
sfree(auth_data);
break;
} }
chan->x11_auth_proto = auth_proto; chan->x11_auth_proto = auth_proto;
chan->x11_auth_data = x11_dehexify(auth_data, chan->x11_auth_data = x11_dehexify(auth_data,
&chan->x11_auth_datalen); &chan->x11_auth_datalen);
sfree(auth_data);
chan->x11_auth_upstream = chan->x11_auth_upstream =
ssh_sharing_add_x11_display(cs->parent->ssh, auth_proto, ssh_sharing_add_x11_display(cs->parent->ssh, auth_proto,
cs, chan); cs, chan);
@ -1700,6 +1712,8 @@ static void share_got_pkt_from_downstream(struct ssh_sharing_connstate *cs,
break; break;
} }
sfree(request_name);
} }
ssh_send_packet_from_downstream(cs->parent->ssh, cs->id, ssh_send_packet_from_downstream(cs->parent->ssh, cs->id,
@ -2099,7 +2113,7 @@ Socket ssh_connection_sharing_init(const char *host, int port,
sharestate->connections = newtree234(share_connstate_cmp); sharestate->connections = newtree234(share_connstate_cmp);
sharestate->ssh = ssh; sharestate->ssh = ssh;
sharestate->server_verstring = NULL; sharestate->server_verstring = NULL;
sharestate->sockname = dupstr(sockname); sharestate->sockname = sockname;
sharestate->nextid = 1; sharestate->nextid = 1;
return NULL; return NULL;
} }

View File

@ -661,6 +661,7 @@ int main(int argc, char **argv)
if (toplevel_callback_pending()) { if (toplevel_callback_pending()) {
ticks = 0; ticks = 0;
next = now;
} else if (run_timers(now, &next)) { } else if (run_timers(now, &next)) {
then = now; then = now;
now = GETTICKCOUNT(); now = GETTICKCOUNT();
@ -670,6 +671,8 @@ int main(int argc, char **argv)
ticks = next - now; ticks = next - now;
} else { } else {
ticks = INFINITE; ticks = INFINITE;
/* no need to initialise next here because we can never
* get WAIT_TIMEOUT */
} }
handles = handle_get_events(&nhandles); handles = handle_get_events(&nhandles);

View File

@ -495,6 +495,7 @@ int do_eventsel_loop(HANDLE other_event)
if (toplevel_callback_pending()) { if (toplevel_callback_pending()) {
ticks = 0; ticks = 0;
next = now;
} else if (run_timers(now, &next)) { } else if (run_timers(now, &next)) {
then = now; then = now;
now = GETTICKCOUNT(); now = GETTICKCOUNT();
@ -504,6 +505,8 @@ int do_eventsel_loop(HANDLE other_event)
ticks = next - now; ticks = next - now;
} else { } else {
ticks = INFINITE; ticks = INFINITE;
/* no need to initialise next here because we can never get
* WAIT_TIMEOUT */
} }
handles = handle_get_events(&nhandles); handles = handle_get_events(&nhandles);

View File

@ -157,6 +157,7 @@ int platform_ssh_share(const char *pi_name, Conf *conf,
if (!make_private_security_descriptor(MUTEX_ALL_ACCESS, if (!make_private_security_descriptor(MUTEX_ALL_ACCESS,
&psd, &acl, logtext)) { &psd, &acl, logtext)) {
sfree(mutexname); sfree(mutexname);
sfree(name);
return SHARE_NONE; return SHARE_NONE;
} }
@ -171,6 +172,7 @@ int platform_ssh_share(const char *pi_name, Conf *conf,
*logtext = dupprintf("CreateMutex(\"%s\") failed: %s", *logtext = dupprintf("CreateMutex(\"%s\") failed: %s",
mutexname, win_strerror(GetLastError())); mutexname, win_strerror(GetLastError()));
sfree(mutexname); sfree(mutexname);
sfree(name);
LocalFree(psd); LocalFree(psd);
LocalFree(acl); LocalFree(acl);
return SHARE_NONE; return SHARE_NONE;