lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 15 Jan 2021 14:11:25 -0500 From: Arvind Sankar <nivedita@...m.mit.edu> To: Borislav Petkov <bp@...en8.de> Cc: Nathan Chancellor <natechancellor@...il.com>, Arnd Bergmann <arnd@...nel.org>, Ard Biesheuvel <ardb@...nel.org>, Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>, x86@...nel.org, Nick Desaulniers <ndesaulniers@...gle.com>, Arnd Bergmann <arnd@...db.de>, Darren Hart <dvhart@...radead.org>, Andy Shevchenko <andy@...radead.org>, "H. Peter Anvin" <hpa@...or.com>, linux-efi@...r.kernel.org, platform-driver-x86@...r.kernel.org, linux-kernel@...r.kernel.org, clang-built-linux@...glegroups.com Subject: Re: [PATCH] x86: efi: avoid BUILD_BUG_ON() for non-constant p4d_index On Fri, Jan 15, 2021 at 08:07:29PM +0100, Borislav Petkov wrote: > On Fri, Jan 15, 2021 at 11:32:03AM -0700, Nathan Chancellor wrote: > > I triggered it with CONFIG_UBSAN=y + CONFIG_UBSAN_UNSIGNED_OVERFLOW=y > > (it can be exposed with an allyesconfig/allmodconfig on mainline > > currently). > > Yah, I can trigger with that, thanks. > > But I'll be damned, check this out: > > clang preprocesses to this: > > do { extern void __compiletime_assert_332(void) ; if (!(!(p4d_index((-68 * ((1UL) << 30))) != p4d_index((0xffffffffff000000UL))))) __compiletime_assert_332(); } while (0); > > The resulting asm is: > > .LBB1_32: > movabsq $-73014444032, %r13 # imm = 0xFFFFFFEF00000000 > testb $1, %al > jne .LBB1_33 > .LBB1_34: > xorl %r14d, %ebx > testl $33554431, %ebx # imm = 0x1FFFFFF > je .LBB1_36 > # %bb.35: > callq __compiletime_assert_332 > > so the undefined symbol is there, leading to: > > ld: arch/x86/platform/efi/efi_64.o: in function `efi_sync_low_kernel_mappings': > /home/boris/kernel/linux/arch/x86/platform/efi/efi_64.c:140: undefined reference to `__compiletime_assert_332' > > Now look at gcc: > > It preprocesses to: > > do { extern void __compiletime_assert_332(void) __attribute__((__error__("BUILD_BUG_ON failed: " "p4d_index(EFI_VA_END) != p4d_index(MODULES_END)"))); if (!(!(p4d_index((-68 * ((1UL) << 30))) != p4d_index((0xffffffffff000000UL))))) __compiletime_assert_332(); } while (0); > > > Resulting asm: > > $ grep __compiletime_assert_332 arch/x86/platform/efi/efi_64.s > $ > > That thing has been optimized away! > > Which means, those build assertions are gone on gcc and they don't catch > diddly squat. I sure hope I'm missing something here... That's how build-time assertions work: they are _supposed_ to be optimized away completely when the assertion is true. If they're _not_ optimized away, the build will fail.
Powered by blists - more mailing lists