]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
binfmt_elf: Warn on missing or suspicious regset note names
authorDave Martin <Dave.Martin@arm.com>
Tue, 1 Jul 2025 13:56:16 +0000 (14:56 +0100)
committerKees Cook <kees@kernel.org>
Tue, 15 Jul 2025 05:27:49 +0000 (22:27 -0700)
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 <Dave.Martin@arm.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Link: https://lore.kernel.org/r/20250701135616.29630-24-Dave.Martin@arm.com
Signed-off-by: Kees Cook <kees@kernel.org>
fs/binfmt_elf.c

index 89063d1d9e9a27c76e76d1b0dbae0bc897f9b4eb..92cf005468b58646d334a9e2ac840b24a10607fe 100644 (file)
@@ -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);