diff --git a/src/cmdu.c b/src/cmdu.c index c01d7de7488d4e094bc74eba69d6fb4e12b54895..f0f7691169e7f1e57bda0f8e442e27b8800ad5dd 100644 --- a/src/cmdu.c +++ b/src/cmdu.c @@ -607,8 +607,14 @@ int cmdu_parse_tlv_single(struct cmdu_buff *c, struct tlv *tv[], } /* malformed cmdu if data remaining */ - if (len) - return -1; + if (len) { + int k = 0; + + while (k < len) { + if (c->data[c->datalen - len + k++] != 0) + return -1; + } + } /* exactly one tlv must be present */ if (policy->present == TLV_PRESENT_ONE && !tv[0]) @@ -661,9 +667,15 @@ int cmdu_parse_tlvs(struct cmdu_buff *c, struct tlv *tv[][16], } } - /* malformed cmdu if data remaining */ - if (len) - return -1; + /* malformed cmdu if data remaining; only allow zero padding */ + if (len) { + int k = 0; + + while (k < len) { + if (c->data[c->datalen - len + k++] != 0) + return -1; + } + } /* strictly check against tlv policies */ for (i = 0; i < policy_len; i++) {