Skip to content

Commit af9803d

Browse files
committed
coredump: split out do_coredump() from vfs_coredump()
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>
1 parent 313a335 commit af9803d

1 file changed

Lines changed: 68 additions & 63 deletions

File tree

fs/coredump.c

Lines changed: 68 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,73 @@ static inline bool coredump_skip(const struct coredump_params *cprm,
10861086
return false;
10871087
}
10881088

1089+
static void do_coredump(struct core_name *cn, struct coredump_params *cprm,
1090+
size_t **argv, int *argc, const struct linux_binfmt *binfmt)
1091+
{
1092+
if (!coredump_parse(cn, cprm, argv, argc)) {
1093+
coredump_report_failure("format_corename failed, aborting core");
1094+
return;
1095+
}
1096+
1097+
switch (cn->core_type) {
1098+
case COREDUMP_FILE:
1099+
if (!coredump_file(cn, cprm, binfmt))
1100+
return;
1101+
break;
1102+
case COREDUMP_PIPE:
1103+
if (!coredump_pipe(cn, cprm, *argv, *argc))
1104+
return;
1105+
break;
1106+
case COREDUMP_SOCK_REQ:
1107+
fallthrough;
1108+
case COREDUMP_SOCK:
1109+
if (!coredump_socket(cn, cprm))
1110+
return;
1111+
break;
1112+
default:
1113+
WARN_ON_ONCE(true);
1114+
return;
1115+
}
1116+
1117+
/* Don't even generate the coredump. */
1118+
if (cn->mask & COREDUMP_REJECT)
1119+
return;
1120+
1121+
/* get us an unshared descriptor table; almost always a no-op */
1122+
/* The cell spufs coredump code reads the file descriptor tables */
1123+
if (unshare_files())
1124+
return;
1125+
1126+
if ((cn->mask & COREDUMP_KERNEL) && !coredump_write(cn, cprm, binfmt))
1127+
return;
1128+
1129+
coredump_sock_shutdown(cprm->file);
1130+
1131+
/* Let the parent know that a coredump was generated. */
1132+
if (cn->mask & COREDUMP_USERSPACE)
1133+
cn->core_dumped = true;
1134+
1135+
/*
1136+
* When core_pipe_limit is set we wait for the coredump server
1137+
* or usermodehelper to finish before exiting so it can e.g.,
1138+
* inspect /proc/<pid>.
1139+
*/
1140+
if (cn->mask & COREDUMP_WAIT) {
1141+
switch (cn->core_type) {
1142+
case COREDUMP_PIPE:
1143+
wait_for_dump_helpers(cprm->file);
1144+
break;
1145+
case COREDUMP_SOCK_REQ:
1146+
fallthrough;
1147+
case COREDUMP_SOCK:
1148+
coredump_sock_wait(cprm->file);
1149+
break;
1150+
default:
1151+
break;
1152+
}
1153+
}
1154+
}
1155+
10891156
void vfs_coredump(const kernel_siginfo_t *siginfo)
10901157
{
10911158
struct cred *cred __free(put_cred) = NULL;
@@ -1133,70 +1200,8 @@ void vfs_coredump(const kernel_siginfo_t *siginfo)
11331200

11341201
old_cred = override_creds(cred);
11351202

1136-
if (!coredump_parse(&cn, &cprm, &argv, &argc)) {
1137-
coredump_report_failure("format_corename failed, aborting core");
1138-
goto close_fail;
1139-
}
1140-
1141-
switch (cn.core_type) {
1142-
case COREDUMP_FILE:
1143-
if (!coredump_file(&cn, &cprm, binfmt))
1144-
goto close_fail;
1145-
break;
1146-
case COREDUMP_PIPE:
1147-
if (!coredump_pipe(&cn, &cprm, argv, argc))
1148-
goto close_fail;
1149-
break;
1150-
case COREDUMP_SOCK_REQ:
1151-
fallthrough;
1152-
case COREDUMP_SOCK:
1153-
if (!coredump_socket(&cn, &cprm))
1154-
goto close_fail;
1155-
break;
1156-
default:
1157-
WARN_ON_ONCE(true);
1158-
goto close_fail;
1159-
}
1160-
1161-
/* Don't even generate the coredump. */
1162-
if (cn.mask & COREDUMP_REJECT)
1163-
goto close_fail;
1164-
1165-
/* get us an unshared descriptor table; almost always a no-op */
1166-
/* The cell spufs coredump code reads the file descriptor tables */
1167-
if (unshare_files())
1168-
goto close_fail;
1169-
1170-
if ((cn.mask & COREDUMP_KERNEL) && !coredump_write(&cn, &cprm, binfmt))
1171-
goto close_fail;
1172-
1173-
coredump_sock_shutdown(cprm.file);
1174-
1175-
/* Let the parent know that a coredump was generated. */
1176-
if (cn.mask & COREDUMP_USERSPACE)
1177-
cn.core_dumped = true;
1178-
1179-
/*
1180-
* When core_pipe_limit is set we wait for the coredump server
1181-
* or usermodehelper to finish before exiting so it can e.g.,
1182-
* inspect /proc/<pid>.
1183-
*/
1184-
if (cn.mask & COREDUMP_WAIT) {
1185-
switch (cn.core_type) {
1186-
case COREDUMP_PIPE:
1187-
wait_for_dump_helpers(cprm.file);
1188-
break;
1189-
case COREDUMP_SOCK_REQ:
1190-
fallthrough;
1191-
case COREDUMP_SOCK:
1192-
coredump_sock_wait(cprm.file);
1193-
break;
1194-
default:
1195-
break;
1196-
}
1197-
}
1203+
do_coredump(&cn, &cprm, &argv, &argc, binfmt);
11981204

1199-
close_fail:
12001205
revert_creds(old_cred);
12011206
coredump_cleanup(&cn, &cprm);
12021207
return;

0 commit comments

Comments
 (0)