From: Joseph Myers Date: Wed, 20 Oct 2021 13:38:50 +0000 (+0000) Subject: Correct access attribute on memfrob (bug 28475) X-Git-Tag: glibc-2.35~408 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c6cabb3a442f467e78c702cffbd5f003f87f44f;p=thirdparty%2Fglibc.git Correct access attribute on memfrob (bug 28475) As noted in bug 28475, the access attribute on memfrob in is incorrect: the function both reads and writes the memory pointed to by its argument, so it needs to use __read_write__, not __write_only__. This incorrect attribute results in a build failure for accessing uninitialized memory for s390x-linux-gnu-O3 with build-many-glibcs.py using GCC mainline. Correct the attribute. Fixing this shows up that some calls to memfrob in elf/ tests are reading uninitialized memory; I'm not entirely sure of the purpose of those calls, but guess they are about ensuring that the stack space is indeed allocated at that point in the function, and so it matters that they are calling a function whose semantics are unknown to the compiler. Thus, change the first memfrob call in those tests to use explicit_bzero instead, as suggested by Florian in , to avoid the use of uninitialized memory. Tested for x86_64, and with build-many-glibcs.py (GCC mainline) for s390x-linux-gnu-O3. --- diff --git a/elf/tst-execstack-needed.c b/elf/tst-execstack-needed.c index 8b794a3d474..85078e40efb 100644 --- a/elf/tst-execstack-needed.c +++ b/elf/tst-execstack-needed.c @@ -26,7 +26,7 @@ static void deeper (void (*f) (void)) { char stack[1100 * 1024]; - memfrob (stack, sizeof stack); + explicit_bzero (stack, sizeof stack); (*f) (); memfrob (stack, sizeof stack); } diff --git a/elf/tst-execstack-prog.c b/elf/tst-execstack-prog.c index 86631533722..1b34bb55979 100644 --- a/elf/tst-execstack-prog.c +++ b/elf/tst-execstack-prog.c @@ -25,7 +25,7 @@ static void deeper (void (*f) (void)) { char stack[1100 * 1024]; - memfrob (stack, sizeof stack); + explicit_bzero (stack, sizeof stack); (*f) (); memfrob (stack, sizeof stack); } diff --git a/elf/tst-execstack.c b/elf/tst-execstack.c index 114f341d76c..7e898b4f58f 100644 --- a/elf/tst-execstack.c +++ b/elf/tst-execstack.c @@ -227,7 +227,7 @@ static void deeper (void (*f) (void)) { char stack[1100 * 1024]; - memfrob (stack, sizeof stack); + explicit_bzero (stack, sizeof stack); (*f) (); memfrob (stack, sizeof stack); } diff --git a/string/string.h b/string/string.h index 8dcafb4ac49..b1b083edce6 100644 --- a/string/string.h +++ b/string/string.h @@ -495,7 +495,7 @@ extern char *strfry (char *__string) __THROW __nonnull ((1)); /* Frobnicate N bytes of S. */ extern void *memfrob (void *__s, size_t __n) __THROW __nonnull ((1)) - __attr_access ((__write_only__, 1, 2)); + __attr_access ((__read_write__, 1, 2)); # ifndef basename /* Return the file name within directory of FILENAME. We don't