@@ -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+
10891156void 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