llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.84k stars 11.47k forks source link

[sanitizer] __NR_newfstatat not defined in linux kernel headers in aarch64 #100098

Open trcrsired opened 1 month ago

trcrsired commented 1 month ago
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:13:23: error: '__NR_newfstatat' was not declared in this scope
   13 | #define SYSCALL(name) __NR_ ## name
      |                       ^~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:80:24: note: in definition of macro '__internal_syscall4'
   80 |   (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3), (long)(a4))
      |                        ^
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:127:31: note: in expansion of macro '__SYSCALL_DISP'
  127 | #define internal_syscall(...) __SYSCALL_DISP(__internal_syscall, __VA_ARGS__)
      |                               ^~~~~~~~~~~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp:420:10: note: in expansion of macro 'internal_syscall'
  420 |   return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf,
      |          ^~~~~~~~~~~~~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp:420:27: note: in expansion of macro 'SYSCALL'
  420 |   return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf,
      |                           ^~~~~~~

https://github.com/llvm/llvm-project/blob/d89f3e8df3160b3afc07bc742c81aa4738ea9646/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp#L389

I propose to add checks for defined(__NR_newfstatat)

#    elif (defined(_LP64) || SANITIZER_X32 ||              \
           (defined(__mips__) && _MIPS_SIM == _ABIN32)) && \
        !SANITIZER_SPARC && defined(__NR_newfstatat)
  return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, (uptr)buf,
                          AT_SYMLINK_NOFOLLOW);

another one:

/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:13:23: error: '__NR_fstatat64' was not declared in this scope; did you mean 'fstatat64'?
   13 | #define SYSCALL(name) __NR_ ## name
      |                       ^~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:80:24: note: in definition of macro '__internal_syscall4'
   80 |   (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3), (long)(a4))
      |                        ^
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_aarch64.inc:127:31: note: in expansion of macro '__SYSCALL_DISP'
  127 | #define internal_syscall(...) __SYSCALL_DISP(__internal_syscall, __VA_ARGS__)
      |                               ^~~~~~~~~~~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp:424:13: note: in expansion of macro 'internal_syscall'
  424 |   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
      |             ^~~~~~~~~~~~~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp:424:30: note: in expansion of macro 'SYSCALL'
  424 |   int res = internal_syscall(SYSCALL(fstatat64), AT_FDCWD, (uptr)path,
      |                              ^~~~~~~
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp:426:3: error: 'stat64_to_stat' was not declared in this scope
  426 |   stat64_to_stat(&buf64, (struct stat *)buf);
      |   ^~~~~~~~~~~~~~
trcrsired commented 1 month ago

riscv also has this issue. You really should first detect _NR##name macros before using them

libtool: compile:  /home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/./gcc/xgcc -shared-libgcc -B/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/./gcc -nostdinc++ -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/src -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/src/.libs -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/libsupc++/.libs -B/home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/bin/ -B/home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/lib/ -isystem /home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/include -isystem /home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/sys-include --sysroot=/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/install/sysroot -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -DHAVE_RPC_XDR_H=0 -DHAVE_TIRPC_RPC_XDR_H=0 -DHAVE_AS_SYM_ASSIGN=1 -I. -I/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common -I.. -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/include -I /home/cqwrteur/toolchains_build/gcc/libsanitizer -isystem /home/cqwrteur/toolchains_build/gcc/libsanitizer/include/system -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long -fPIC -fno-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros -I../../libstdc++-v3/include -I../../libstdc++-v3/include/riscv64-linux-gnu -I/home/cqwrteur/toolchains_build/gcc/libsanitizer/../libstdc++-v3/libsupc++ -std=gnu++14 -DSANITIZER_LIBBACKTRACE -DSANITIZER_CP_DEMANGLE -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/../libbacktrace -I ../libbacktrace -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/../include -include /home/cqwrteur/toolchains_build/gcc/libsanitizer/libbacktrace/backtrace-rename.h -g -O2 -D_GNU_SOURCE -MT sanitizer_platform_limits_solaris.lo -MD -MP -MF .deps/sanitizer_platform_limits_solaris.Tpo -c /home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.cpp  -fPIC -DPIC -o .libs/sanitizer_platform_limits_solaris.o
libtool: compile:  /home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/./gcc/xgcc -shared-libgcc -B/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/./gcc -nostdinc++ -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/src -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/src/.libs -L/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/targetbuild/riscv64-linux-gnu/gcc_phase2/riscv64-linux-gnu/libstdc++-v3/libsupc++/.libs -B/home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/bin/ -B/home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/lib/ -isystem /home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/include -isystem /home/cqwrteur/toolchains/x86_64-generic-linux-gnu/riscv64-linux-gnu/riscv64-linux-gnu/sys-include --sysroot=/home/cqwrteur/toolchains_build/toolchainbuildscripts/gccbuild/x86_64-w64-mingw32/.gnuartifacts/riscv64-linux-gnu/install/sysroot -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -DHAVE_RPC_XDR_H=0 -DHAVE_TIRPC_RPC_XDR_H=0 -DHAVE_AS_SYM_ASSIGN=1 -I. -I/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common -I.. -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/include -I /home/cqwrteur/toolchains_build/gcc/libsanitizer -isystem /home/cqwrteur/toolchains_build/gcc/libsanitizer/include/system -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long -fPIC -fno-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros -I../../libstdc++-v3/include -I../../libstdc++-v3/include/riscv64-linux-gnu -I/home/cqwrteur/toolchains_build/gcc/libsanitizer/../libstdc++-v3/libsupc++ -std=gnu++14 -DSANITIZER_LIBBACKTRACE -DSANITIZER_CP_DEMANGLE -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/../libbacktrace -I ../libbacktrace -I /home/cqwrteur/toolchains_build/gcc/libsanitizer/../include -include /home/cqwrteur/toolchains_build/gcc/libsanitizer/libbacktrace/backtrace-rename.h -g -O2 -D_GNU_SOURCE -MT sanitizer_posix.lo -MD -MP -MF .deps/sanitizer_posix.Tpo -c /home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_posix.cpp  -fPIC -DPIC -o .libs/sanitizer_posix.o
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_linux.cpp: In function '__sanitizer::uptr __sanitizer::internal_lstat(const char*, void*)':
/home/cqwrteur/toolchains_build/gcc/libsanitizer/sanitizer_common/sanitizer_syscall_linux_riscv64.inc:29:23: error: '__NR_newfstatat' was not declared in this scope
   29 | #define SYSCALL(name) __NR_##name
      |                       ^~~~~
nikic commented 1 month ago

I believe that this is a bug in the upcoming 6.11 kernel, see https://bugzilla.redhat.com/show_bug.cgi?id=2301919. The syscall constants are defined in previous versions.

fweimer-rh commented 1 month ago

Raised on the kernel lists: