vppinfra: fix memcpy undefined behaviour 40/31240/4
authorBenoît Ganne <bganne@cisco.com>
Thu, 11 Feb 2021 18:46:43 +0000 (19:46 +0100)
committerDamjan Marion <dmarion@me.com>
Mon, 15 Feb 2021 16:17:14 +0000 (16:17 +0000)
commit1a3e08a7197addb1c07e66c1b1da3286c9bcb140
treefcbb03afc8aa57d3c9c63a7cdf5a27d0c24cf502
parentce3f8249b59d3c3540cf0b87cc1c2f0d3a3a1814
vppinfra: fix memcpy undefined behaviour

Calling mem{cpy,move} with NULL pointers results in undefined behaviour.
This in turns is exploited by GCC. For example, the sequence:
    memcpy (dst, src, n);
    if (!src)
      return;
    src[0] = 0xcafe;
will be optimized as
    memcpy (dst, src, n);
    src[0] = 0xcafe;
IOW the test for NULL is gone.

vec_*() functions sometime call memcpy with NULL pointers and 0 length,
triggering this optimization. For example, the sequence:
    vec_append(v1, v2);
    len = vec_len(v2);
will crash if v2 is NULL, because the test for NULL pointer in vec_len()
has been optimized out.

This commit fixes occurrences of such undefined behaviour, and also
introduces a memcpy wrapper to catch those in debug mode.

Type: fix

Change-Id: I175e2dd726a883f97cf7de3b15f66d4b237ddefd
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vppinfra/hash.c
src/vppinfra/memcpy_avx2.h
src/vppinfra/memcpy_avx512.h
src/vppinfra/memcpy_sse3.h
src/vppinfra/string.h
src/vppinfra/vec.h