No description
Find a file
Willy Tarreau e8f1633d2d tools/nolibc: Fix missing strlen() definition and infinite loop with gcc-12
[ Upstream commit bfc3b0f056 ]

When built at -Os, gcc-12 recognizes an strlen() pattern in nolibc_strlen()
and replaces it with a jump to strlen(), which is not defined as a symbol
and breaks compilation. Worse, when the function is called strlen(), the
function is simply replaced with a jump to itself, hence becomes an
infinite loop.

One way to avoid this is to always set -ffreestanding, but the calling
code doesn't know this and there's no way (either via attributes or
pragmas) to globally enable it from include files, effectively leaving
a painful situation for the caller.

Alexey suggested to place an empty asm() statement inside the loop to
stop gcc from recognizing a well-known pattern, which happens to work
pretty fine. At least it allows us to make sure our local definition
is not replaced with a self jump.

The function only needs to be renamed back to strlen() so that the symbol
exists, which implies that nolibc_strlen() which is used on variable
strings has to be declared as a macro that points back to it before the
strlen() macro is redifined.

It was verified to produce valid code with gcc 3.4 to 12.1 at different
optimization levels, and both with constant and variable strings.

In case this problem surfaces again in the future, an alternate approach
consisting in adding an optimize("no-tree-loop-distribute-patterns")
function attribute for gcc>=12 worked as well but is less pretty.

Reported-by: kernel test robot <yujie.liu@intel.com>
Link: https://lore.kernel.org/r/202210081618.754a77db-yujie.liu@intel.com
Fixes: 66b6f755ad ("rcutorture: Import a copy of nolibc")
Fixes: 96980b833a ("tools/nolibc/string: do not use __builtin_strlen() at -O0")
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-10 18:17:16 +01:00
arch arm64: Add AMPERE1 to the Spectre-BHB affected list 2022-11-04 00:00:35 +09:00
block blk-mq: fix null pointer dereference in blk_mq_clear_rq_mapping() 2022-10-29 10:08:33 +02:00
certs certs: make system keyring depend on built-in x509 parser 2022-09-24 04:31:18 +09:00
crypto crypto: akcipher - default implementation for setting a private key 2022-10-21 12:38:59 +02:00
Documentation docs/process/howto: Replace C89 with C11 2022-11-10 18:17:15 +01:00
drivers RDMA/qedr: clean up work queue on failure in qedr_alloc_resources() 2022-11-10 18:17:16 +01:00
fs nfs4: Fix kmemleak when allocate slot failed 2022-11-10 18:17:16 +01:00
include net/mlx5: Fix possible use-after-free in async command interface 2022-11-04 00:00:34 +09:00
init arm64 fixes for -rc3 2022-08-26 11:32:53 -07:00
io_uring io_uring: don't gate task_work run on TIF_NOTIFY_SIGNAL 2022-10-29 10:08:35 +02:00
ipc ipc: mqueue: fix possible memory leak in init_mqueue_fs() 2022-10-21 12:38:55 +02:00
kernel PM: hibernate: Allow hybrid sleep to work with s2idle 2022-11-04 00:00:31 +09:00
lib lib/Kconfig.debug: Add check for non-constant .{s,u}leb128 support to DWARF5 2022-10-21 12:39:29 +02:00
LICENSES
mm mm: prep_compound_tail() clear page->private 2022-11-04 00:00:23 +09:00
net SUNRPC: Fix null-ptr-deref when xps sysfs alloc failed 2022-11-10 18:17:15 +01:00
samples Tracing updates for 5.20 / 6.0 2022-08-05 09:41:12 -07:00
scripts kbuild: rpm-pkg: fix breakage when V=1 is used 2022-10-21 12:39:01 +02:00
security selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context() 2022-10-29 10:08:29 +02:00
sound ALSA: aoa: Fix I2S device accounting 2022-11-04 00:00:33 +09:00
tools tools/nolibc: Fix missing strlen() definition and infinite loop with gcc-12 2022-11-10 18:17:16 +01:00
usr Not a lot of material this cycle. Many singleton patches against various 2022-05-27 11:22:03 -07:00
virt kvm: Add support for arch compat vm ioctls 2022-10-29 10:08:30 +02:00
.clang-format PCI/DOE: Add DOE mailbox support functions 2022-07-19 15:38:04 -07:00
.cocciconfig
.get_maintainer.ignore get_maintainer: add Alan to .get_maintainer.ignore 2022-08-20 15:17:44 -07:00
.gitattributes
.gitignore kbuild: split the second line of *.mod into *.usyms 2022-05-08 03:16:59 +09:00
.mailmap Qualcomm ARM64 DTS fixes for 6.0 2022-09-23 16:44:37 +02:00
COPYING
CREDITS drm for 5.20/6.0 2022-08-03 19:52:08 -07:00
Kbuild
Kconfig
MAINTAINERS One MAINTAINERS update, two MM fixes, both cc:stable 2022-10-01 09:13:29 -07:00
Makefile Linux 6.0.7 2022-11-04 00:00:35 +09:00
README

Linux kernel
============

There are several guides for kernel developers and users. These guides can
be rendered in a number of formats, like HTML and PDF. Please read
Documentation/admin-guide/README.rst first.

In order to build the documentation, use ``make htmldocs`` or
``make pdfdocs``.  The formatted documentation can also be read online at:

    https://www.kernel.org/doc/html/latest/

There are various text files in the Documentation/ subdirectory,
several of them using the Restructured Text markup notation.

Please read the Documentation/process/changes.rst file, as it contains the
requirements for building and running the kernel, and information about
the problems which may result by upgrading your kernel.