diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-10-21 14:03:25 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2014-12-05 15:41:47 +0100 |
commit | 42e0a317c64b1dfc2612f0891bef45f648079ba7 (patch) | |
tree | 9760002991bf6983078b49a63dff951e9560c4c6 /src/libcharon/encoding/parser.c | |
parent | fac310a46718d72e4184217f3f40205599575cad (diff) | |
download | strongswan-42e0a317c64b1dfc2612f0891bef45f648079ba7.tar.bz2 strongswan-42e0a317c64b1dfc2612f0891bef45f648079ba7.tar.xz |
ike: Only parse payloads valid for the current IKE version
Diffstat (limited to 'src/libcharon/encoding/parser.c')
-rw-r--r-- | src/libcharon/encoding/parser.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/libcharon/encoding/parser.c b/src/libcharon/encoding/parser.c index d6240fde2..f8340367e 100644 --- a/src/libcharon/encoding/parser.c +++ b/src/libcharon/encoding/parser.c @@ -59,6 +59,11 @@ struct private_parser_t { parser_t public; /** + * major IKE version + */ + u_int8_t major_version; + + /** * Current bit for reading in input data. */ u_int8_t bit_pos; @@ -369,7 +374,14 @@ METHOD(parser_t, parse_payload, status_t, encoding_rule_t *rule; /* create instance of the payload to parse */ - pld = payload_create(payload_type); + if (payload_is_known(payload_type, this->major_version)) + { + pld = payload_create(payload_type); + } + else + { + pld = (payload_t*)unknown_payload_create(payload_type); + } DBG2(DBG_ENC, "parsing %N payload, %d bytes left", payload_type_names, payload_type, this->input_roof - this->byte_pos); @@ -629,6 +641,12 @@ METHOD(parser_t, reset_context, void, this->bit_pos = 0; } +METHOD(parser_t, set_major_version, void, + private_parser_t *this, u_int8_t major_version) +{ + this->major_version = major_version; +} + METHOD(parser_t, destroy, void, private_parser_t *this) { @@ -646,6 +664,7 @@ parser_t *parser_create(chunk_t data) .public = { .parse_payload = _parse_payload, .reset_context = _reset_context, + .set_major_version = _set_major_version, .get_remaining_byte_count = _get_remaining_byte_count, .destroy = _destroy, }, |