]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
coredump: split out do_coredump() from vfs_coredump()
authorChristian Brauner <brauner@kernel.org>
Mon, 3 Nov 2025 14:57:34 +0000 (15:57 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 5 Nov 2025 22:11:52 +0000 (23:11 +0100)
Make the function easier to follow and prepare for some of the following
changes.

Link: https://patch.msgid.link/20251103-work-creds-guards-prepare_creds-v1-8-b447b82f2c9b@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/coredump.c

index 8253b28bc72815ab5817e40f2cc5624ba45cfd04..79c681f1d64793a5256e1e261b767830b52c59b1 100644 (file)
@@ -1086,6 +1086,73 @@ static inline bool coredump_skip(const struct coredump_params *cprm,
        return false;
 }
 
+static void do_coredump(struct core_name *cn, struct coredump_params *cprm,
+                       size_t **argv, int *argc, const struct linux_binfmt *binfmt)
+{
+       if (!coredump_parse(cn, cprm, argv, argc)) {
+               coredump_report_failure("format_corename failed, aborting core");
+               return;
+       }
+
+       switch (cn->core_type) {
+       case COREDUMP_FILE:
+               if (!coredump_file(cn, cprm, binfmt))
+                       return;
+               break;
+       case COREDUMP_PIPE:
+               if (!coredump_pipe(cn, cprm, *argv, *argc))
+                       return;
+               break;
+       case COREDUMP_SOCK_REQ:
+               fallthrough;
+       case COREDUMP_SOCK:
+               if (!coredump_socket(cn, cprm))
+                       return;
+               break;
+       default:
+               WARN_ON_ONCE(true);
+               return;
+       }
+
+       /* Don't even generate the coredump. */
+       if (cn->mask & COREDUMP_REJECT)
+               return;
+
+       /* get us an unshared descriptor table; almost always a no-op */
+       /* The cell spufs coredump code reads the file descriptor tables */
+       if (unshare_files())
+               return;
+
+       if ((cn->mask & COREDUMP_KERNEL) && !coredump_write(cn, cprm, binfmt))
+               return;
+
+       coredump_sock_shutdown(cprm->file);
+
+       /* Let the parent know that a coredump was generated. */
+       if (cn->mask & COREDUMP_USERSPACE)
+               cn->core_dumped = true;
+
+       /*
+        * When core_pipe_limit is set we wait for the coredump server
+        * or usermodehelper to finish before exiting so it can e.g.,
+        * inspect /proc/<pid>.
+        */
+       if (cn->mask & COREDUMP_WAIT) {
+               switch (cn->core_type) {
+               case COREDUMP_PIPE:
+                       wait_for_dump_helpers(cprm->file);
+                       break;
+               case COREDUMP_SOCK_REQ:
+                       fallthrough;
+               case COREDUMP_SOCK:
+                       coredump_sock_wait(cprm->file);
+                       break;
+               default:
+                       break;
+               }
+       }
+}
+
 void vfs_coredump(const kernel_siginfo_t *siginfo)
 {
        struct cred *cred __free(put_cred) = NULL;
@@ -1133,70 +1200,8 @@ void vfs_coredump(const kernel_siginfo_t *siginfo)
 
        old_cred = override_creds(cred);
 
-       if (!coredump_parse(&cn, &cprm, &argv, &argc)) {
-               coredump_report_failure("format_corename failed, aborting core");
-               goto close_fail;
-       }
-
-       switch (cn.core_type) {
-       case COREDUMP_FILE:
-               if (!coredump_file(&cn, &cprm, binfmt))
-                       goto close_fail;
-               break;
-       case COREDUMP_PIPE:
-               if (!coredump_pipe(&cn, &cprm, argv, argc))
-                       goto close_fail;
-               break;
-       case COREDUMP_SOCK_REQ:
-               fallthrough;
-       case COREDUMP_SOCK:
-               if (!coredump_socket(&cn, &cprm))
-                       goto close_fail;
-               break;
-       default:
-               WARN_ON_ONCE(true);
-               goto close_fail;
-       }
-
-       /* Don't even generate the coredump. */
-       if (cn.mask & COREDUMP_REJECT)
-               goto close_fail;
-
-       /* get us an unshared descriptor table; almost always a no-op */
-       /* The cell spufs coredump code reads the file descriptor tables */
-       if (unshare_files())
-               goto close_fail;
-
-       if ((cn.mask & COREDUMP_KERNEL) && !coredump_write(&cn, &cprm, binfmt))
-               goto close_fail;
-
-       coredump_sock_shutdown(cprm.file);
-
-       /* Let the parent know that a coredump was generated. */
-       if (cn.mask & COREDUMP_USERSPACE)
-               cn.core_dumped = true;
-
-       /*
-        * When core_pipe_limit is set we wait for the coredump server
-        * or usermodehelper to finish before exiting so it can e.g.,
-        * inspect /proc/<pid>.
-        */
-       if (cn.mask & COREDUMP_WAIT) {
-               switch (cn.core_type) {
-               case COREDUMP_PIPE:
-                       wait_for_dump_helpers(cprm.file);
-                       break;
-               case COREDUMP_SOCK_REQ:
-                       fallthrough;
-               case COREDUMP_SOCK:
-                       coredump_sock_wait(cprm.file);
-                       break;
-               default:
-                       break;
-               }
-       }
+       do_coredump(&cn, &cprm, &argv, &argc, binfmt);
 
-close_fail:
        revert_creds(old_cred);
        coredump_cleanup(&cn, &cprm);
        return;