Re: [PATCH 10/11] x86/purgatory: Compile purgatory.c with -D__NO_FORTIFY

Thomas Huth <[email protected]>
Newsgroups org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 14/08/2026 17.24, Borislav Petkov wrote:
> On Thu, Aug 13, 2026 at 03:49:48PM +0200, Thomas Huth wrote:
>> From: Thomas Huth <[email protected]>
>>
>> purgatory.c includes both, the <crypto/sha2.h> header and the
>> arch/x86/boot/string.h header. The latter provides its own prototypes
>> for a lot of string functions which clash with the fortified macros
>> from <linux/string.h>.
>> The next patch will add #include <linux/string.h> to sha2.h to be able
> 
> This is exactly the problem - people are adding main include namespace headers
> from linux/ to arch/x86/boot, or, as you do, to purgatory, which are special
> - and then they have to do all kinds of hacks so that it builds.
> 
> (btw, there's no "next patch" in git history).
> 
>> to use memzero_explicit() there, so we have to compile the code in
>> purgatory.c with -D__NO_FORTIFY to avoid compilation problems in this
>> file.
> 
> How about you extract memzero_explicit() to a separate header in
> include/asm-generic/ or simply put it in include/asm-generic/string.h and then
> use that header instead?
> 
> Then you shouldn't have prototype clashes...
> 
> It does sound cleaner to me but you'd have to try it to see whether it
> actually works.
Thanks for the suggestion, I gave it a try, but I only ended up with another 
huger ugliness this way: Since memzero_explicit() needs memset(), that 
memset() has to be declared somewhere. Since I cannot include 
<linux/string.h> from the file where I put memzero_explicit(), we would need 
to make sure that all files that want to use <crypto/sha2.h> include either 
<linux/string.h> or arch/x86/boot/string.h or whatever before including 
sha2.h - i.e. this creates a likely unacceptable indirect dependency of 
sha2.h on including a string.h header first.

Adding the -D__NO_FORTIFY to the purgatory Makefile sounds like the lesser 
of the two evils to me, especially since there is already another line in 
that Makefile that adds -D__NO_FORTIFY to one of the other files there:

  CFLAGS_sha256.o := -D__DISABLE_EXPORTS -D__NO_FORTIFY

Maybe I should rather change the patch to add -D__NO_FORTIFY unconditionally 
to generic PURGATORY_CFLAGS there? Something like:

diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile
--- a/arch/x86/purgatory/Makefile
+++ b/arch/x86/purgatory/Makefile
@@ -11,7 +11,7 @@ $(obj)/string.o: 
$(srctree)/arch/x86/boot/compressed/string.c FORCE
  $(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE
         $(call if_changed_rule,cc_o_c)

-CFLAGS_sha256.o := -D__DISABLE_EXPORTS -D__NO_FORTIFY
+CFLAGS_sha256.o := -D__DISABLE_EXPORTS

  # When profile-guided optimization is enabled, llvm emits two different
  # overlapping text sections, which is not supported by kexec. Remove profile
@@ -37,6 +37,7 @@ PURGATORY_CFLAGS := -mcmodel=small -ffreestanding 
-fno-zero-initialized-in-bss -
  PURGATORY_CFLAGS += -fpic -fvisibility=hidden
  PURGATORY_CFLAGS += $(DISABLE_KSTACK_ERASE) -DDISABLE_BRANCH_PROFILING
  PURGATORY_CFLAGS += -fno-stack-protector
+PURGATORY_CFLAGS +=  -D__NO_FORTIFY

  # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That
  # in turn leaves some undefined symbols like __fentry__ in purgatory and not

WDYT?

  Thomas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.