diff --git a/ssh.c b/ssh.c index 0edaf932..acc4598b 100644 --- a/ssh.c +++ b/ssh.c @@ -884,6 +884,15 @@ static int ssh2_rdpkt(unsigned char **data, int *datalen) st->len = GET_32BIT(pktin.data); st->pad = pktin.data[4]; + /* + * _Completely_ silly lengths should be stomped on before they + * do us any more damage. + */ + if (st->len < 0 || st->pad < 0 || st->len + st->pad < 0) { + bombout(("Incoming packet was garbled on decryption")); + crReturn(0); + } + /* * This enables us to deduce the payload length. */