[RFC PATCH 22/39] sysctl: refresh namespace IPC bounds per call
From: wen . yang
Date: Wed Oct 28 2026 - 12:40:19 EST
From: Wen Yang <wen.yang@xxxxxxxxx>
Refresh IPC limits before validating namespace sysctl writes.
Suggested-by: Joel Granados <joel.granados@xxxxxxxxxx>
Signed-off-by: Wen Yang <wen.yang@xxxxxxxxx>
---
ipc/ipc_sysctl.c | 50 ++++++++++++++++++++++++++++--------------------
1 file changed, 29 insertions(+), 21 deletions(-)
diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c
index e02e2ea70907..29a1f442c503 100644
--- a/ipc/ipc_sysctl.c
+++ b/ipc/ipc_sysctl.c
@@ -6,7 +6,6 @@
*/
#include <linux/module.h>
-#include <linux/limits.h>
#include <linux/ipc.h>
#include <linux/nsproxy.h>
#include <linux/sysctl.h>
@@ -74,6 +73,15 @@ int ipc_mni = IPCMNI;
int ipc_mni_shift = IPCMNI_SHIFT;
int ipc_min_cycle = RADIX_TREE_MAP_SIZE;
+static int proc_ipc_mni(const struct ctl_table *table, int write,
+ void *buffer, size_t *lenp, loff_t *ppos)
+{
+ struct ctl_table tmp = *table;
+
+ tmp.max = READ_ONCE(ipc_mni);
+ return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
+}
+
static const struct ctl_table ipc_sysctls[] = {
{
.procname = "shmmax",
@@ -98,9 +106,9 @@ static const struct ctl_table ipc_sysctls[] = {
.data = &init_ipc_ns.shm_ctlmni,
.maxlen = sizeof(init_ipc_ns.shm_ctlmni),
.mode = 0644,
- .proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = &ipc_mni,
+ .proc_handler = proc_ipc_mni,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "shm_rmid_forced",
@@ -108,8 +116,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.shm_rmid_forced),
.mode = 0644,
.proc_handler = proc_ipc_dointvec_minmax_orphans,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_ONE,
+ .min = 0,
+ .max = 1,
},
{
.procname = "msgmax",
@@ -117,17 +125,17 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.msg_ctlmax),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_INT_MAX,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "msgmni",
.data = &init_ipc_ns.msg_ctlmni,
.maxlen = sizeof(init_ipc_ns.msg_ctlmni),
.mode = 0644,
- .proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = &ipc_mni,
+ .proc_handler = proc_ipc_mni,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "auto_msgmni",
@@ -135,8 +143,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_ipc_auto_msgmni,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_ONE,
+ .min = 0,
+ .max = 1,
},
{
.procname = "msgmnb",
@@ -144,8 +152,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.msg_ctlmnb),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_INT_MAX,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "sem",
@@ -161,8 +169,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.ids[IPC_SEM_IDS].next_id),
.mode = 0444,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_INT_MAX,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "msg_next_id",
@@ -170,8 +178,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.ids[IPC_MSG_IDS].next_id),
.mode = 0444,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_INT_MAX,
+ .min = 0,
+ .max = INT_MAX,
},
{
.procname = "shm_next_id",
@@ -179,8 +187,8 @@ static const struct ctl_table ipc_sysctls[] = {
.maxlen = sizeof(init_ipc_ns.ids[IPC_SHM_IDS].next_id),
.mode = 0444,
.proc_handler = proc_dointvec_minmax,
- .extra1 = SYSCTL_ZERO,
- .extra2 = SYSCTL_INT_MAX,
+ .min = 0,
+ .max = INT_MAX,
},
#endif
};
--
2.25.1