1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef LINUX_PID_SYSCTL_H
3 #define LINUX_PID_SYSCTL_H
5 #include <linux/pid_namespace.h>
7 #if defined(CONFIG_SYSCTL) && defined(CONFIG_MEMFD_CREATE)
8 static int pid_mfd_noexec_dointvec_minmax(const struct ctl_table
*table
,
9 int write
, void *buf
, size_t *lenp
, loff_t
*ppos
)
11 struct pid_namespace
*ns
= task_active_pid_ns(current
);
12 struct ctl_table table_copy
;
13 int err
, scope
, parent_scope
;
15 if (write
&& !ns_capable(ns
->user_ns
, CAP_SYS_ADMIN
))
20 /* You cannot set a lower enforcement value than your parent. */
21 parent_scope
= pidns_memfd_noexec_scope(ns
->parent
);
22 /* Equivalent to pidns_memfd_noexec_scope(ns). */
23 scope
= max(READ_ONCE(ns
->memfd_noexec_scope
), parent_scope
);
25 table_copy
.data
= &scope
;
26 table_copy
.extra1
= &parent_scope
;
28 err
= proc_dointvec_minmax(&table_copy
, write
, buf
, lenp
, ppos
);
30 WRITE_ONCE(ns
->memfd_noexec_scope
, scope
);
34 static struct ctl_table pid_ns_ctl_table_vm
[] = {
36 .procname
= "memfd_noexec",
37 .data
= &init_pid_ns
.memfd_noexec_scope
,
38 .maxlen
= sizeof(init_pid_ns
.memfd_noexec_scope
),
40 .proc_handler
= pid_mfd_noexec_dointvec_minmax
,
41 .extra1
= SYSCTL_ZERO
,
45 static inline void register_pid_ns_sysctl_table_vm(void)
47 register_sysctl("vm", pid_ns_ctl_table_vm
);
50 static inline void register_pid_ns_sysctl_table_vm(void) {}
53 #endif /* LINUX_PID_SYSCTL_H */