From: Dave Martin Date: Tue, 1 Jul 2025 13:56:16 +0000 (+0100) Subject: binfmt_elf: Warn on missing or suspicious regset note names X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a55128d392e86507a0e6672ebcdf20d1dd77744b;p=thirdparty%2Fkernel%2Fstable.git binfmt_elf: Warn on missing or suspicious regset note names Now that all regset definitions declare an explicit note name, warn if the note name is missing when generating a core dump. Simplify the fallback to always guess "LINUX", which is appropriate for all Linux-specific notes (i.e., all newly added notes, for a long time now). The one standard exception (PR_FPREG) will no longer have an "unexpected" note name overridden, but a warning will still be emitted. Also warn if the specified note name doesn't match the legacy pattern -- but don't bother to override the name in this case. This warning can be removed in future if new note types emerge that require a specific note name that is not "LINUX". No functional change, beyond the extra noise in dmesg and not overriding an unexpected note name for PR_FPREG any more. Now that all upstream arches are ported to use USER_REGSET_NOTE_TYPE(), new regsets created by copy-pasting existing code should end up correct by construction. Signed-off-by: Dave Martin Cc: Oleg Nesterov Cc: Kees Cook Cc: Akihiko Odaki Reviewed-by: Akihiko Odaki Link: https://lore.kernel.org/r/20250701135616.29630-24-Dave.Martin@arm.com Signed-off-by: Kees Cook --- diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 89063d1d9e9a2..92cf005468b58 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1750,8 +1750,13 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, if (is_fpreg) SET_PR_FPVALID(&t->prstatus); - if (!note_name) - note_name = is_fpreg ? NN_PRFPREG : "LINUX"; + /* There should be a note name, but if not, guess: */ + if (WARN_ON_ONCE(!note_name)) + note_name = "LINUX"; + else + /* Warn on non-legacy-compatible names, for now. */ + WARN_ON_ONCE(strcmp(note_name, + is_fpreg ? "CORE" : "LINUX")); __fill_note(&t->notes[note_iter], note_name, note_type, ret, data);