[Devel] [RFC 07/54] coredump: fix CONFIG_VE=n build

Eva Kurchatova eva.kurchatova at virtuozzo.com
Wed Apr 29 22:58:07 MSK 2026


Signed-off-by: Eva Kurchatova <eva.kurchatova at virtuozzo.com>
---
 fs/coredump.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/fs/coredump.c b/fs/coredump.c
index fed2436cc846..7ea79b8dfd7f 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -68,6 +68,13 @@ static unsigned int core_sort_vma;
 static int core_name_size = CORENAME_MAX_SIZE;
 unsigned int core_file_note_size_limit = CORE_FILE_NOTE_SIZE_DEFAULT;
 
+#ifdef CONFIG_VE
+#define core_pattern_ve(ve) (ve)->core_pattern
+#else
+static char core_pattern[CORENAME_MAX_SIZE] = "core";
+#define core_pattern_ve(ve) core_pattern
+#endif
+
 struct core_name {
 	char *corename;
 	int used, size;
@@ -209,12 +216,14 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
 			   size_t **argv, int *argc)
 {
 	const struct cred *cred = current_cred();
-	struct ve_struct *ve = get_exec_env();
-	const char *pat_ptr = ve->core_pattern;
+	const char *pat_ptr = core_pattern_ve(ve);
 	int ispipe = (*pat_ptr == '|');
 	bool was_space = false;
 	int pid_in_pattern = 0;
 	int err = 0;
+#ifdef CONFIG_VE
+	struct ve_struct *ve = get_exec_env();
+#endif
 
 	cn->used = 0;
 	cn->corename = NULL;
@@ -223,7 +232,7 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm,
 	cn->corename[0] = '\0';
 
 	if (ispipe) {
-		int argvs = sizeof(ve->core_pattern) / 2;
+		int argvs = sizeof(core_pattern_ve(ve)) / 2;
 		(*argv) = kmalloc_array(argvs, sizeof(**argv), GFP_KERNEL);
 		if (!(*argv))
 			return -ENOMEM;
@@ -636,11 +645,17 @@ void do_coredump(const kernel_siginfo_t *siginfo)
 		retval = -ENOMEM;
 		sub_info = call_usermodehelper_setup(helper_argv[0],
 						helper_argv, NULL, GFP_KERNEL,
-						umh_pipe_setup, NULL, &cprm);
+				       umh_pipe_setup, NULL, &cprm);
+#ifdef CONFIG_VE
 		if (sub_info)
 			retval = call_usermodehelper_exec_ve(get_exec_env(),
 							     sub_info,
 							     UMH_WAIT_EXEC);
+#else
+		if (sub_info)
+			retval = call_usermodehelper_exec(sub_info,
+							  UMH_WAIT_EXEC);
+#endif
 
 		kfree(helper_argv);
 		if (retval) {
@@ -978,9 +993,11 @@ EXPORT_SYMBOL(dump_align);
 
 void validate_coredump_safety(void)
 {
+#ifdef CONFIG_VE
 	struct ve_struct *ve = get_exec_env();
+#endif
 	if (suid_dumpable == SUID_DUMP_ROOT &&
-	    ve->core_pattern[0] != '/' && ve->core_pattern[0] != '|') {
+		core_pattern_ve(ve)[0] != '/' && core_pattern_ve(ve)[0] != '|') {
 
 		coredump_report_failure("Unsafe core_pattern used with fs.suid_dumpable=2: "
 			"pipe handler or fully qualified core dump path required. "
@@ -1013,7 +1030,7 @@ static struct ctl_table coredump_sysctls[] = {
 	},
 	{
 		.procname	= "core_pattern",
-		.data		= ve0.core_pattern,
+		.data		= &core_pattern_ve(&ve0),
 		.maxlen		= CORENAME_MAX_SIZE,
 		.mode		= 0644 | S_ISVTX,
 		.proc_handler	= proc_dostring_coredump_virtual,
-- 
2.54.0



More information about the Devel mailing list