diff -urN strongswan-2.8.10/programs/pluto/asn1.c strongswan-2.8.11/programs/pluto/asn1.c --- strongswan-2.8.10/programs/pluto/asn1.c 2009-06-19 12:29:52.000000000 +0200 +++ strongswan-2.8.11/programs/pluto/asn1.c 2009-07-06 09:50:50.000000000 +0200 @@ -151,6 +151,14 @@ u_char n; size_t len; + if (blob->len < 2) + { + DBG(DBG_PARSING, + DBG_log("insufficient number of octets to parse ASN.1 length") + ) + return ASN1_INVALID_LENGTH; + } + /* advance from tag field on to length field */ blob->ptr++; blob->len--; @@ -159,16 +167,25 @@ n = *blob->ptr++; blob->len--; - if ((n & 0x80) == 0) /* single length octet */ + if ((n & 0x80) == 0) + { /* single length octet */ + if (n > blob->len) + { + DBG(DBG_PARSING, + DBG_log("length is larger than remaining blob size") + ) + return ASN1_INVALID_LENGTH; + } return n; + } /* composite length, determine number of length octets */ n &= 0x7f; - if (n > blob->len) + if (n == 0 || n > blob->len) { DBG(DBG_PARSING, - DBG_log("number of length octets is larger than ASN.1 object") + DBG_log("number of length octets invalid") ) return ASN1_INVALID_LENGTH; }