> 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));

Reply via email to