> You can reproduce with ping -s 0 host (it crashes if the packet size > is less than 24). > > =================================================================== > RCS file: /cvs/src/sbin/ping/ping.c,v > retrieving revision 1.123 > diff -u -p -r1.123 ping.c > --- ping.c 2 May 2015 18:03:37 -0000 1.123 > +++ ping.c 5 Aug 2015 08:40:22 -0000 > @@ -803,7 +803,7 @@ pr_pack(char *buf, int cc, struct sockad > (void)printf(" (TRUNC!)"); > cp = (u_char *)&icp->icmp_data[sizeof(struct payload)]; > dp = &outpack[8 + sizeof(struct payload)]; > - if (!(options & F_PINGFILLED)) { > + if (!(options & F_PINGFILLED) && datalen > > sizeof(payload)) { > chacha_ivsetup(&fill_stream, payload.mac); > chacha_encrypt_bytes(&fill_stream, dp, dp, > datalen - sizeof(payload)); >
Seems it should be >= sizeof(payload), also in the other place. Index: ping.c =================================================================== RCS file: /cvs/src/sbin/ping/ping.c,v retrieving revision 1.123 diff -u -p -u -r1.123 ping.c --- ping.c 2 May 2015 18:03:37 -0000 1.123 +++ ping.c 5 Aug 2015 12:40:51 -0000 @@ -651,7 +651,7 @@ pinger(void) memcpy(&outpack[8], &payload, sizeof(payload)); - if (!(options & F_PINGFILLED) && datalen > sizeof(payload)) { + if (!(options & F_PINGFILLED) && datalen >= sizeof(payload)) { u_int8_t *dp = &outpack[8 + sizeof(payload)]; chacha_ivsetup(&fill_stream, payload.mac); @@ -803,7 +803,7 @@ pr_pack(char *buf, int cc, struct sockad (void)printf(" (TRUNC!)"); cp = (u_char *)&icp->icmp_data[sizeof(struct payload)]; dp = &outpack[8 + sizeof(struct payload)]; - if (!(options & F_PINGFILLED)) { + if (!(options & F_PINGFILLED) && datalen >= sizeof(payload)) { chacha_ivsetup(&fill_stream, payload.mac); chacha_encrypt_bytes(&fill_stream, dp, dp, datalen - sizeof(payload));