]> git.baikalelectronics.ru Git - kernel.git/commit
qnx4: work around gcc false positive warning bug
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 20 Sep 2021 17:26:21 +0000 (10:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 21 Sep 2021 15:36:48 +0000 (08:36 -0700)
commitab432fb429e900e21009bad15cb0ff04c110fef3
treefde779dcaac1c639fad9427cc4bd1a1d35647bbf
parent8a6c6e9885d2ad29532c996b2318123e883df1e6
qnx4: work around gcc false positive warning bug

In commit b68eab1852d0 ("qnx4: avoid stringop-overread errors") I tried
to teach gcc about how the directory entry structure can be two
different things depending on a status flag.  It made the code clearer,
and it seemed to make gcc happy.

However, Arnd points to a gcc bug, where despite using two different
members of a union, gcc then gets confused, and uses the size of one of
the members to decide if a string overrun happens.  And not necessarily
the rigth one.

End result: with some configurations, gcc-11 will still complain about
the source buffer size being overread:

  fs/qnx4/dir.c: In function 'qnx4_readdir':
  fs/qnx4/dir.c:76:32: error: 'strnlen' specified bound [16, 48] exceeds source size 1 [-Werror=stringop-overread]
     76 |                         size = strnlen(name, size);
        |                                ^~~~~~~~~~~~~~~~~~~
  fs/qnx4/dir.c:26:22: note: source object declared here
     26 |                 char de_name;
        |                      ^~~~~~~

because gcc will get confused about which union member entry is actually
getting accessed, even when the source code is very clear about it.  Gcc
internally will have combined two "redundant" pointers (pointing to
different union elements that are at the same offset), and takes the
size checking from one or the other - not necessarily the right one.

This is clearly a gcc bug, but we can work around it fairly easily.  The
biggest thing here is the big honking comment about why we do what we
do.

Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578#c6
Reported-and-tested-by: Arnd Bergmann <arnd@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/qnx4/dir.c