{
DetectCsumData *cd = (DetectCsumData *)m->ctx;
- if (p->ip6h == NULL || p->icmpv6h == NULL || p->proto != IPPROTO_ICMPV6 || PKT_IS_PSEUDOPKT(p))
+ if (p->ip6h == NULL || p->icmpv6h == NULL || p->proto != IPPROTO_ICMPV6 || PKT_IS_PSEUDOPKT(p) ||
+ (p->pktlen - ((uint8_t *)p->icmpv6h - p->pkt)) <= 0) {
return 0;
+ }
if (p->flags & PKT_IGNORE_CHECKSUM) {
return cd->valid;
if (p->icmpv6vars.comp_csum == -1)
p->icmpv6vars.comp_csum = ICMPV6CalculateChecksum(p->ip6h->s_ip6_addrs,
- (uint16_t *)p->icmpv6h,
- IPV6_GET_PLEN(p));
+ (uint16_t *)p->icmpv6h,
+ p->pktlen - ((uint8_t *)p->icmpv6h - p->pkt));
if (p->icmpv6vars.comp_csum == p->icmpv6h->csum && cd->valid == 1)
return 1;