1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-23 15:09:24 -05:00

Merge tag '0.66'

This brings in the rest of the 0.66 branch, including some changes new
on master.

Conflicts:
        doc/plink.but
        sshrsa.c

(The conflicts were both trivial: in one, the addition of an extra
parameter to rsa2_newkey on master happened on the line next to 0.66's
addition of a check for NULL return value, and in the other, I'd got
the version number in the plink -h transcript messed up on master.)
This commit is contained in:
Simon Tatham 2015-11-07 09:54:05 +00:00
commit 8fdeb3a95c
11 changed files with 86 additions and 19 deletions

View File

@ -35,7 +35,7 @@ module putty
ifeq "$(RELEASE)" "" set Ndate $(!builddate) ifeq "$(RELEASE)" "" set Ndate $(!builddate)
ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -pe 's/(....)(..)(..)/$$1-$$2-$$3/' > date ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -pe 's/(....)(..)(..)/$$1-$$2-$$3/' > date
ifneq "$(Ndate)" "" read Date date ifneq "$(Ndate)" "" read Date date
set Epoch 15641 # update this at every release set Epoch 15746 # update this at every release
ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -ne 'use Time::Local; /(....)(..)(..)/ and print timegm(0,0,0,$$3,$$2-1,$$1) / 86400 - $(Epoch)' > days ifneq "$(Ndate)" "" in . do echo $(Ndate) | perl -ne 'use Time::Local; /(....)(..)(..)/ and print timegm(0,0,0,$$3,$$2-1,$$1) / 86400 - $(Epoch)' > days
ifneq "$(Ndate)" "" read Days days ifneq "$(Ndate)" "" read Days days

View File

@ -1 +1 @@
0.65 0.66

View File

@ -41,7 +41,7 @@ use Plink:
\c Z:\sysosd>plink \c Z:\sysosd>plink
\c Plink: command-line connection utility \c Plink: command-line connection utility
\c Release 0.XX \c Release 0.66
\c Usage: plink [options] [user@]host [command] \c Usage: plink [options] [user@]host [command]
\c ("host" can also be a PuTTY saved session name) \c ("host" can also be a PuTTY saved session name)
\c Options: \c Options:

View File

@ -39,7 +39,7 @@ use PSCP:
\c Z:\owendadmin>pscp \c Z:\owendadmin>pscp
\c PuTTY Secure Copy client \c PuTTY Secure Copy client
\c Release 0.65 \c Release 0.66
\c Usage: pscp [options] [user@]host:source target \c Usage: pscp [options] [user@]host:source target
\c pscp [options] source [source...] [user@]host:target \c pscp [options] source [source...] [user@]host:target
\c pscp [options] -ls [user@]host:filespec \c pscp [options] -ls [user@]host:filespec

View File

@ -953,3 +953,20 @@ DSR/DTR.
For example, \cq{-sercfg 19200,8,n,1,N} denotes a baud rate of For example, \cq{-sercfg 19200,8,n,1,N} denotes a baud rate of
19200, 8 data bits, no parity, 1 stop bit and no flow control. 19200, 8 data bits, no parity, 1 stop bit and no flow control.
\S2{using-cmdline-sshlog} \i\c{-sessionlog}, \i\c{-sshlog},
\i\c{-sshrawlog}: specify session logging
These options cause the PuTTY network tools to write out a \i{log
file}. Each of them expects a file name as an argument, e.g.
\cq{-sshlog putty.log} causes an SSH packet log to be written to a
file called \cq{putty.log}. The three different options select
different logging modes, all available from the GUI too:
\b \c{-sessionlog} selects \q{All session output} logging mode.
\b \c{-sshlog} selects \q{SSH packets} logging mode.
\b \c{-sshrawlog} selects \q{SSH packets and raw data} logging mode.
For more information on logging configuration, see \k{config-logging}.

View File

@ -164,6 +164,7 @@ void logfopen(void *handle)
{ {
struct LogContext *ctx = (struct LogContext *)handle; struct LogContext *ctx = (struct LogContext *)handle;
struct tm tm; struct tm tm;
FILE *fp;
int mode; int mode;
/* Prevent repeat calls */ /* Prevent repeat calls */
@ -183,10 +184,10 @@ void logfopen(void *handle)
conf_get_str(ctx->conf, CONF_host), conf_get_str(ctx->conf, CONF_host),
conf_get_int(ctx->conf, CONF_port), &tm); conf_get_int(ctx->conf, CONF_port), &tm);
ctx->lgfp = f_open(ctx->currlogfilename, "r", FALSE); /* file already present? */ fp = f_open(ctx->currlogfilename, "r", FALSE); /* file already present? */
if (ctx->lgfp) { if (fp) {
int logxfovr = conf_get_int(ctx->conf, CONF_logxfovr); int logxfovr = conf_get_int(ctx->conf, CONF_logxfovr);
fclose(ctx->lgfp); fclose(fp);
if (logxfovr != LGXF_ASK) { if (logxfovr != LGXF_ASK) {
mode = ((logxfovr == LGXF_OVR) ? 2 : 1); mode = ((logxfovr == LGXF_OVR) ? 2 : 1);
} else } else

10
ssh.c
View File

@ -364,6 +364,7 @@ static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
struct Packet *pktin); struct Packet *pktin);
static void ssh2_channel_check_close(struct ssh_channel *c); static void ssh2_channel_check_close(struct ssh_channel *c);
static void ssh_channel_destroy(struct ssh_channel *c); static void ssh_channel_destroy(struct ssh_channel *c);
static void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin);
/* /*
* Buffer management constants. There are several of these for * Buffer management constants. There are several of these for
@ -1834,6 +1835,15 @@ static struct Packet *ssh2_rdpkt(Ssh ssh, const unsigned char **data,
} }
} }
/*
* RFC 4253 doesn't explicitly say that completely empty packets
* with no type byte are forbidden, so treat them as deserving
* an SSH_MSG_UNIMPLEMENTED.
*/
if (st->pktin->length <= 5) { /* == 5 we hope, but robustness */
ssh2_msg_something_unimplemented(ssh, st->pktin);
crStop(NULL);
}
/* /*
* pktin->body and pktin->length should identify the semantic * pktin->body and pktin->length should identify the semantic
* content of the packet, excluding the initial type byte. * content of the packet, excluding the initial type byte.

View File

@ -773,6 +773,8 @@ static int rsa2_pubkey_bits(const struct ssh_signkey *self,
int ret; int ret;
rsa = rsa2_newkey(self, (const char *) blob, len); rsa = rsa2_newkey(self, (const char *) blob, len);
if (!rsa)
return -1;
ret = bignum_bitcount(rsa->modulus); ret = bignum_bitcount(rsa->modulus);
rsa2_freekey(rsa); rsa2_freekey(rsa);

View File

@ -5,6 +5,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include <limits.h>
#include <time.h> #include <time.h>
#include <assert.h> #include <assert.h>
@ -2343,7 +2344,7 @@ static void check_boundary(Terminal *term, int x, int y)
termline *ldata; termline *ldata;
/* Validate input coordinates, just in case. */ /* Validate input coordinates, just in case. */
if (x == 0 || x > term->cols) if (x <= 0 || x > term->cols)
return; return;
ldata = scrlineptr(y); ldata = scrlineptr(y);
@ -3493,8 +3494,15 @@ static void term_out(Terminal *term)
if (term->esc_nargs <= ARGS_MAX) { if (term->esc_nargs <= ARGS_MAX) {
if (term->esc_args[term->esc_nargs - 1] == ARG_DEFAULT) if (term->esc_args[term->esc_nargs - 1] == ARG_DEFAULT)
term->esc_args[term->esc_nargs - 1] = 0; term->esc_args[term->esc_nargs - 1] = 0;
if (term->esc_args[term->esc_nargs - 1] <=
UINT_MAX / 10 &&
term->esc_args[term->esc_nargs - 1] * 10 <=
UINT_MAX - c - '0')
term->esc_args[term->esc_nargs - 1] = term->esc_args[term->esc_nargs - 1] =
10 * term->esc_args[term->esc_nargs - 1] + c - '0'; 10 * term->esc_args[term->esc_nargs - 1] +
c - '0';
else
term->esc_args[term->esc_nargs - 1] = UINT_MAX;
} }
term->termstate = SEEN_CSI; term->termstate = SEEN_CSI;
} else if (c == ';') { } else if (c == ';') {
@ -3510,8 +3518,10 @@ static void term_out(Terminal *term)
term->esc_query = c; term->esc_query = c;
term->termstate = SEEN_CSI; term->termstate = SEEN_CSI;
} else } else
#define CLAMP(arg, lim) ((arg) = ((arg) > (lim)) ? (lim) : (arg))
switch (ANSI(c, term->esc_query)) { switch (ANSI(c, term->esc_query)) {
case 'A': /* CUU: move up N lines */ case 'A': /* CUU: move up N lines */
CLAMP(term->esc_args[0], term->rows);
move(term, term->curs.x, move(term, term->curs.x,
term->curs.y - def(term->esc_args[0], 1), 1); term->curs.y - def(term->esc_args[0], 1), 1);
seen_disp_event(term); seen_disp_event(term);
@ -3520,6 +3530,7 @@ static void term_out(Terminal *term)
compatibility(ANSI); compatibility(ANSI);
/* FALLTHROUGH */ /* FALLTHROUGH */
case 'B': /* CUD: Cursor down */ case 'B': /* CUD: Cursor down */
CLAMP(term->esc_args[0], term->rows);
move(term, term->curs.x, move(term, term->curs.x,
term->curs.y + def(term->esc_args[0], 1), 1); term->curs.y + def(term->esc_args[0], 1), 1);
seen_disp_event(term); seen_disp_event(term);
@ -3535,23 +3546,27 @@ static void term_out(Terminal *term)
compatibility(ANSI); compatibility(ANSI);
/* FALLTHROUGH */ /* FALLTHROUGH */
case 'C': /* CUF: Cursor right */ case 'C': /* CUF: Cursor right */
CLAMP(term->esc_args[0], term->cols);
move(term, term->curs.x + def(term->esc_args[0], 1), move(term, term->curs.x + def(term->esc_args[0], 1),
term->curs.y, 1); term->curs.y, 1);
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'D': /* CUB: move left N cols */ case 'D': /* CUB: move left N cols */
CLAMP(term->esc_args[0], term->cols);
move(term, term->curs.x - def(term->esc_args[0], 1), move(term, term->curs.x - def(term->esc_args[0], 1),
term->curs.y, 1); term->curs.y, 1);
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'E': /* CNL: move down N lines and CR */ case 'E': /* CNL: move down N lines and CR */
compatibility(ANSI); compatibility(ANSI);
CLAMP(term->esc_args[0], term->rows);
move(term, 0, move(term, 0,
term->curs.y + def(term->esc_args[0], 1), 1); term->curs.y + def(term->esc_args[0], 1), 1);
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'F': /* CPL: move up N lines and CR */ case 'F': /* CPL: move up N lines and CR */
compatibility(ANSI); compatibility(ANSI);
CLAMP(term->esc_args[0], term->rows);
move(term, 0, move(term, 0,
term->curs.y - def(term->esc_args[0], 1), 1); term->curs.y - def(term->esc_args[0], 1), 1);
seen_disp_event(term); seen_disp_event(term);
@ -3559,12 +3574,14 @@ static void term_out(Terminal *term)
case 'G': /* CHA */ case 'G': /* CHA */
case '`': /* HPA: set horizontal posn */ case '`': /* HPA: set horizontal posn */
compatibility(ANSI); compatibility(ANSI);
CLAMP(term->esc_args[0], term->cols);
move(term, def(term->esc_args[0], 1) - 1, move(term, def(term->esc_args[0], 1) - 1,
term->curs.y, 0); term->curs.y, 0);
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'd': /* VPA: set vertical posn */ case 'd': /* VPA: set vertical posn */
compatibility(ANSI); compatibility(ANSI);
CLAMP(term->esc_args[0], term->rows);
move(term, term->curs.x, move(term, term->curs.x,
((term->dec_om ? term->marg_t : 0) + ((term->dec_om ? term->marg_t : 0) +
def(term->esc_args[0], 1) - 1), def(term->esc_args[0], 1) - 1),
@ -3575,6 +3592,8 @@ static void term_out(Terminal *term)
case 'f': /* HVP: set horz and vert posns at once */ case 'f': /* HVP: set horz and vert posns at once */
if (term->esc_nargs < 2) if (term->esc_nargs < 2)
term->esc_args[1] = ARG_DEFAULT; term->esc_args[1] = ARG_DEFAULT;
CLAMP(term->esc_args[0], term->rows);
CLAMP(term->esc_args[1], term->cols);
move(term, def(term->esc_args[1], 1) - 1, move(term, def(term->esc_args[1], 1) - 1,
((term->dec_om ? term->marg_t : 0) + ((term->dec_om ? term->marg_t : 0) +
def(term->esc_args[0], 1) - 1), def(term->esc_args[0], 1) - 1),
@ -3610,6 +3629,7 @@ static void term_out(Terminal *term)
break; break;
case 'L': /* IL: insert lines */ case 'L': /* IL: insert lines */
compatibility(VT102); compatibility(VT102);
CLAMP(term->esc_args[0], term->rows);
if (term->curs.y <= term->marg_b) if (term->curs.y <= term->marg_b)
scroll(term, term->curs.y, term->marg_b, scroll(term, term->curs.y, term->marg_b,
-def(term->esc_args[0], 1), FALSE); -def(term->esc_args[0], 1), FALSE);
@ -3617,6 +3637,7 @@ static void term_out(Terminal *term)
break; break;
case 'M': /* DL: delete lines */ case 'M': /* DL: delete lines */
compatibility(VT102); compatibility(VT102);
CLAMP(term->esc_args[0], term->rows);
if (term->curs.y <= term->marg_b) if (term->curs.y <= term->marg_b)
scroll(term, term->curs.y, term->marg_b, scroll(term, term->curs.y, term->marg_b,
def(term->esc_args[0], 1), def(term->esc_args[0], 1),
@ -3626,11 +3647,13 @@ static void term_out(Terminal *term)
case '@': /* ICH: insert chars */ case '@': /* ICH: insert chars */
/* XXX VTTEST says this is vt220, vt510 manual says vt102 */ /* XXX VTTEST says this is vt220, vt510 manual says vt102 */
compatibility(VT102); compatibility(VT102);
CLAMP(term->esc_args[0], term->cols);
insch(term, def(term->esc_args[0], 1)); insch(term, def(term->esc_args[0], 1));
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'P': /* DCH: delete chars */ case 'P': /* DCH: delete chars */
compatibility(VT102); compatibility(VT102);
CLAMP(term->esc_args[0], term->cols);
insch(term, -def(term->esc_args[0], 1)); insch(term, -def(term->esc_args[0], 1));
seen_disp_event(term); seen_disp_event(term);
break; break;
@ -3708,6 +3731,8 @@ static void term_out(Terminal *term)
compatibility(VT100); compatibility(VT100);
if (term->esc_nargs <= 2) { if (term->esc_nargs <= 2) {
int top, bot; int top, bot;
CLAMP(term->esc_args[0], term->rows);
CLAMP(term->esc_args[1], term->rows);
top = def(term->esc_args[0], 1) - 1; top = def(term->esc_args[0], 1) - 1;
bot = (term->esc_nargs <= 1 bot = (term->esc_nargs <= 1
|| term->esc_args[1] == 0 ? || term->esc_args[1] == 0 ?
@ -4063,6 +4088,7 @@ static void term_out(Terminal *term)
} }
break; break;
case 'S': /* SU: Scroll up */ case 'S': /* SU: Scroll up */
CLAMP(term->esc_args[0], term->rows);
compatibility(SCOANSI); compatibility(SCOANSI);
scroll(term, term->marg_t, term->marg_b, scroll(term, term->marg_t, term->marg_b,
def(term->esc_args[0], 1), TRUE); def(term->esc_args[0], 1), TRUE);
@ -4070,6 +4096,7 @@ static void term_out(Terminal *term)
seen_disp_event(term); seen_disp_event(term);
break; break;
case 'T': /* SD: Scroll down */ case 'T': /* SD: Scroll down */
CLAMP(term->esc_args[0], term->rows);
compatibility(SCOANSI); compatibility(SCOANSI);
scroll(term, term->marg_t, term->marg_b, scroll(term, term->marg_t, term->marg_b,
-def(term->esc_args[0], 1), TRUE); -def(term->esc_args[0], 1), TRUE);
@ -4112,6 +4139,7 @@ static void term_out(Terminal *term)
/* XXX VTTEST says this is vt220, vt510 manual /* XXX VTTEST says this is vt220, vt510 manual
* says vt100 */ * says vt100 */
compatibility(ANSIMIN); compatibility(ANSIMIN);
CLAMP(term->esc_args[0], term->cols);
{ {
int n = def(term->esc_args[0], 1); int n = def(term->esc_args[0], 1);
pos cursplus; pos cursplus;
@ -4145,6 +4173,7 @@ static void term_out(Terminal *term)
break; break;
case 'Z': /* CBT */ case 'Z': /* CBT */
compatibility(OTHER); compatibility(OTHER);
CLAMP(term->esc_args[0], term->cols);
{ {
int i = def(term->esc_args[0], 1); int i = def(term->esc_args[0], 1);
pos old_curs = term->curs; pos old_curs = term->curs;
@ -4205,7 +4234,7 @@ static void term_out(Terminal *term)
break; break;
case ANSI('F', '='): /* set normal foreground */ case ANSI('F', '='): /* set normal foreground */
compatibility(SCOANSI); compatibility(SCOANSI);
if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { if (term->esc_args[0] < 16) {
long colour = long colour =
(sco2ansicolour[term->esc_args[0] & 0x7] | (sco2ansicolour[term->esc_args[0] & 0x7] |
(term->esc_args[0] & 0x8)) << (term->esc_args[0] & 0x8)) <<
@ -4219,7 +4248,7 @@ static void term_out(Terminal *term)
break; break;
case ANSI('G', '='): /* set normal background */ case ANSI('G', '='): /* set normal background */
compatibility(SCOANSI); compatibility(SCOANSI);
if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { if (term->esc_args[0] < 16) {
long colour = long colour =
(sco2ansicolour[term->esc_args[0] & 0x7] | (sco2ansicolour[term->esc_args[0] & 0x7] |
(term->esc_args[0] & 0x8)) << (term->esc_args[0] & 0x8)) <<
@ -4343,7 +4372,11 @@ static void term_out(Terminal *term)
case '7': case '7':
case '8': case '8':
case '9': case '9':
if (term->esc_args[0] <= UINT_MAX / 10 &&
term->esc_args[0] * 10 <= UINT_MAX - c - '0')
term->esc_args[0] = 10 * term->esc_args[0] + c - '0'; term->esc_args[0] = 10 * term->esc_args[0] + c - '0';
else
term->esc_args[0] = UINT_MAX;
break; break;
case 'L': case 'L':
/* /*
@ -4425,7 +4458,11 @@ static void term_out(Terminal *term)
case '7': case '7':
case '8': case '8':
case '9': case '9':
if (term->esc_args[0] <= UINT_MAX / 10 &&
term->esc_args[0] * 10 <= UINT_MAX - c - '0')
term->esc_args[0] = 10 * term->esc_args[0] + c - '0'; term->esc_args[0] = 10 * term->esc_args[0] + c - '0';
else
term->esc_args[0] = UINT_MAX;
break; break;
default: default:
term->termstate = OSC_STRING; term->termstate = OSC_STRING;

View File

@ -172,7 +172,7 @@ struct terminal_tag {
#define ARGS_MAX 32 /* max # of esc sequence arguments */ #define ARGS_MAX 32 /* max # of esc sequence arguments */
#define ARG_DEFAULT 0 /* if an arg isn't specified */ #define ARG_DEFAULT 0 /* if an arg isn't specified */
#define def(a,d) ( (a) == ARG_DEFAULT ? (d) : (a) ) #define def(a,d) ( (a) == ARG_DEFAULT ? (d) : (a) )
int esc_args[ARGS_MAX]; unsigned esc_args[ARGS_MAX];
int esc_nargs; int esc_nargs;
int esc_query; int esc_query;
#define ANSI(x,y) ((x)+((y)<<8)) #define ANSI(x,y) ((x)+((y)<<8))

View File

@ -13,10 +13,10 @@
[Setup] [Setup]
AppName=PuTTY AppName=PuTTY
AppVerName=PuTTY version 0.65 AppVerName=PuTTY version 0.66
VersionInfoTextVersion=Release 0.65 VersionInfoTextVersion=Release 0.66
AppVersion=0.65 AppVersion=0.66
VersionInfoVersion=0.65.0.0 VersionInfoVersion=0.66.0.0
AppPublisher=Simon Tatham AppPublisher=Simon Tatham
AppPublisherURL=http://www.chiark.greenend.org.uk/~sgtatham/putty/ AppPublisherURL=http://www.chiark.greenend.org.uk/~sgtatham/putty/
AppReadmeFile={app}\README.txt AppReadmeFile={app}\README.txt