- const struct m3ua_param_header *hdr = (const struct m3ua_param_header *) p;
- ND_PRINT((ndo, "\n\t\t\t%s: ", tok2str(ParamName, "Unknown Parameter (0x%04x)", EXTRACT_16BITS(&hdr->tag))));
- tag_value_print(ndo, p + sizeof(struct m3ua_param_header), EXTRACT_16BITS(&hdr->tag), EXTRACT_16BITS(&hdr->len));
- p += EXTRACT_16BITS(&hdr->len);
- align = (p - buf) % 4;
- p += (align) ? 4 - align : 0;
+ if (p + sizeof(struct m3ua_param_header) > buf + size)
+ goto invalid;
+ ND_TCHECK2(*p, sizeof(struct m3ua_param_header));
+ /* Parameter Tag */
+ hdr_tag = EXTRACT_16BITS(p);
+ ND_PRINT((ndo, "\n\t\t\t%s: ", tok2str(ParamName, "Unknown Parameter (0x%04x)", hdr_tag)));
+ /* Parameter Length */
+ hdr_len = EXTRACT_16BITS(p + 2);
+ if (hdr_len < sizeof(struct m3ua_param_header))
+ goto invalid;
+ /* Parameter Value */
+ align = (p + hdr_len - buf) % 4;
+ align = align ? 4 - align : 0;
+ ND_TCHECK2(*p, hdr_len + align);
+ tag_value_print(ndo, p, hdr_tag, hdr_len - sizeof(struct m3ua_param_header));
+ p += hdr_len + align;