[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