]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix iconv build with GCC mainline
authorJoseph Myers <joseph@codesourcery.com>
Mon, 23 Aug 2021 16:18:42 +0000 (16:18 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Mon, 23 Aug 2021 16:18:42 +0000 (16:18 +0000)
Current GCC mainline produces -Wstringop-overflow errors building some
iconv converters, as discussed at
<https://gcc.gnu.org/pipermail/gcc/2021-July/236943.html>.  Add an
__builtin_unreachable call as suggested so that GCC can see the case
that would involve a buffer overflow is unreachable; because the
unreachability depends on valid conversion state being passed into the
function from previous conversion steps, it's not something the
compiler can reasonably deduce on its own.

Tested with build-many-glibcs.py that, together with
<https://sourceware.org/pipermail/libc-alpha/2021-August/130244.html>,
it restores the glibc build for powerpc-linux-gnu.

iconv/loop.c

index 062cc1b868c1efa5fb33caabff85cf9d36c95234..560a5f6394e8faf698b9b16e245e030fdc1640e4 100644 (file)
@@ -436,6 +436,12 @@ SINGLE(LOOPFCT) (struct __gconv_step *step,
     return __GCONV_FULL_OUTPUT;
 
   /*  Now add characters from the normal input buffer.  */
+  if (inlen >= MAX_NEEDED_INPUT)
+    /* Avoid a -Wstringop-overflow= warning when this loop is
+       unrolled.  The compiler cannot otherwise see that this is
+       unreachable because it depends on (state->__count & 7) not
+       being too large after a previous conversion step.  */
+    __builtin_unreachable ();
   do
     bytebuf[inlen++] = *inptr++;
   while (inlen < MAX_NEEDED_INPUT && inptr < inend);