• Arnaldo Carvalho de Melo's avatar
    tools build: Add test-reallocarray.c to test-all.c to fix the build · a96c03e8
    Arnaldo Carvalho de Melo authored
    When a test is in the FEATURE_TESTS_BASIC list in tools/build/Makefile.feature
    must be added to tools/build/feature/test-all.c, because the successfull
    compilation and linking of that test-all.bin file means that all the
    features listed in FEATURE_TESTS_BASIC are present in the system, so we
    don't have to go on feature by feature test building them.
    
    Since reallocarray() is expected to be present in modern systems, it has
    a place in FEATURE_TESTS_BASIC, so that we speed up the build process
    building just that file.
    
    For older systems, such as ubuntu:16.04 (build failure reported by Jin
    Yao) debian:8, and for the current flagship RHEL distro, RHEL7, the
    build will fail as test-all.bin (without test-reallocarray.c included)
    passes but reallocarray() isn't present, making the build fail with:
    
        CC       /tmp/build/perf/libbpf.o
        MKDIR    /tmp/build/perf/fs/
        CC       /tmp/build/perf/fs/tracing_path.o
        LD       /tmp/build/perf/fd/libapi-in.o
        CC       /tmp/build/perf/bpf.o
      libbpf.c: In function 'bpf_object__add_program':
      libbpf.c:367:10: error: implicit declaration of function 'reallocarray' [-Werror=implicit-function-declaration]
        progs = reallocarray(progs, nr_progs + 1, sizeof(progs[0]));
                ^
      libbpf.c:367:2: error: nested extern declaration of 'reallocarray' [-Werror=nested-externs]
        progs = reallocarray(progs, nr_progs + 1, sizeof(progs[0]));
        ^
      libbpf.c:367:8: error: assignment makes pointer from integer without a cast [-Werror=int-conversion]
        progs = reallocarray(progs, nr_progs + 1, sizeof(progs[0]));
              ^
      libbpf.c: In function 'bpf_object__elf_collect':
      libbpf.c:887:10: error: assignment makes pointer from integer without a cast [-Werror=int-conversion]
          reloc = reallocarray(reloc, nr_reloc,
                ^
      libbpf.c: In function 'bpf_program__reloc_text':
      libbpf.c:1394:12: error: assignment makes pointer from integer without a cast [-Werror=int-conversion]
         new_insn = reallocarray(prog->insns, new_cnt, sizeof(*insn));
                  ^
        CC       /tmp/build/perf/nlattr.o
    
    Even with:
    
      $ grep reallocarray /tmp/build/perf/FEATURE-DUMP
      feature-reallocarray=1
      $
    
    Which ubuntu:16.04.5 LTS doesn't have:
    
      perfbuilder@38a153a1bba8:/$ head -2 /etc/os-release
      NAME="Ubuntu"
      VERSION="16.04.5 LTS (Xenial Xerus)"
      perfbuilder@38a153a1bba8:/$ find /usr/include/ -name "*.h" | xargs grep -w reallocarray
      perfbuilder@38a153a1bba8:/$
    
    Fix it by including it to test-all.c, which ends up forcing the
    individual tests to be triggered and for the build process to notice
    that indeed reallocarray() is not there:
    
      perfbuilder@38a153a1bba8:/$ cat /tmp/build/perf/feature/test-all.make.output
      In file included from test-all.c:178:0:
      test-reallocarray.c: In function 'main_test_reallocarray':
      test-reallocarray.c:7:11: error: implicit declaration of function 'reallocarray' [-Werror=implicit-function-declaration]
        return !!reallocarray(NULL, 1, 1);
                 ^
      cc1: all warnings being treated as errors
      perfbuilder@38a153a1bba8:/$
    
    That is the only test that is failing on Ubuntu 16.03.5 LTS, so all
    tests are forced:
    
      perfbuilder@38a153a1bba8:/tmp/build/perf/feature$ ls -lSr *.make.output
      <SNIP successful tests>
      -rw-r--r--. 1 perfbuilder perfbuilder   0 Feb 14 15:00 test-dwarf.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder   0 Feb 14 14:16 test-cplus-demangle.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder   0 Feb 14 15:00 test-bpf.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder   0 Feb 14 15:00 test-backtrace.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 104 Feb 14 15:00 test-bionic.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 107 Feb 14 15:00 test-libunwind-x86.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 115 Feb 14 15:00 test-libunwind-aarch64.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 122 Feb 14 15:00 test-libbabeltrace.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 254 Feb 14 15:00 test-reallocarray.make.output
      -rw-r--r--. 1 perfbuilder perfbuilder 312 Feb 14 15:00 test-all.make.output
      perfbuilder@38a153a1bba8:/tmp/build/perf/feature$
    
    And that reallocarray() one shows:
    
      perfbuilder@38a153a1bba8:/tmp/build/perf/feature$ cat test-reallocarray.make.output
      test-reallocarray.c: In function 'main':
      test-reallocarray.c:7:11: error: implicit declaration of function 'reallocarray' [-Werror=implicit-function-declaration]
        return !!reallocarray(NULL, 1, 1);
                 ^
      cc1: all warnings being treated as errors
      perfbuilder@38a153a1bba8:/tmp/build/perf/feature$
    
    Which now generates the expected result:
    
      perfbuilder@38a153a1bba8:~$ grep reallocarray /tmp/build/perf/FEATURE-DUMP
      feature-reallocarray=0
      perfbuilder@38a153a1bba8:~$
    
    The fallback mechanism kicks in and libbpf and perf are again buildable
    in systems without reallocarray():
    
      $ cat tools/include/tools/libc_compat.h
      // SPDX-License-Identifier: (LGPL-2.0+ OR BSD-2-Clause)
      /* Copyright (C) 2018 Netronome Systems, Inc. */
    
      #ifndef __TOOLS_LIBC_COMPAT_H
      #define __TOOLS_LIBC_COMPAT_H
    
      #include <stdlib.h>
      #include <linux/overflow.h>
    
      #ifdef COMPAT_NEED_REALLOCARRAY
      static inline void *reallocarray(void *ptr, size_t nmemb, size_t size)
      {
    	  size_t bytes;
    
    	  if (unlikely(check_mul_overflow(nmemb, size, &bytes)))
    		  return NULL;
    	  return realloc(ptr, bytes);
      }
      #endif
      #endif
      $
    Reported-by: default avatarJin Yao <yao.jin@linux.intel.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Jakub Kicinski <jakub.kicinski@netronome.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Song Liu <songliubraving@fb.com>
    Cc: Yonghong Song <yhs@fb.com>
    Fixes: 531b014e ("tools: bpf: make use of reallocarray")
    Link: https://lkml.kernel.org/n/tip-aonqku8axii8rxki5g11w40b@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    a96c03e8
test-reallocarray.c 152 Bytes