mm: Fix the uninitialized use in overcommit_policy_handler
Subsystems (2)
PATCH v3 1/1 mm: Fix the uninitialized use in overcommit_policy_handler
An unexpected value of /proc/sys/vm/overcommit_memory we will get, after running the following program.
int main()
{
int fd = open("/proc/sys/vm/overcommit_memory", O_RDWR)
write(fd, "1", 1);
write(fd, "2", 1);
close(fd);
}write(fd, "2", 1) will pass *ppos = 1 to proc_dointvec_minmax. proc_dointvec_minmax will return 0 without setting new_policy.
t.data = &new_policy;
ret = proc_dointvec_minmax(&t, write, buffer, lenp, ppos)
-->do_proc_dointvec
-->__do_proc_dointvec
if (write) {
if (proc_first_pos_non_zero_ignore(ppos, table))
goto out;sysctl_overcommit_memory = new_policy;
so sysctl_overcommit_memory will be set to an uninitialized value.
Check whether new_policy has been changed by proc_dointvec_minmax.
---
v3:
* Correct commit message.
v2:
* Check whether new_policy has been changed by proc_dointvec_minmax.
mm/util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/util.c +2 -2
@@ -756,7 +756,7 @@ int overcommit_policy_handler(struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { struct ctl_table t; -int new_policy; +int new_policy =-1 ;int ret;/*
@@ -774,7 +774,7 @@ int overcommit_policy_handler(struct ctl_table *table, int write, void *buffer, t = *table; t.data = &new_policy; ret =proc_dointvec_minmax (&t, write, buffer, lenp, ppos); -if (ret) +if (ret || new_policy ==-1 )return ret;mm_compute_batch (new_policy);
Signature · 1 line
2.17.1
Andrew Morton
maintainerQuoted 22 lines · On Thu, 23 Sep 2021 02:05:24 +0000 Chen Jun <[email protected]> wrote:
An unexpected value of
/proc/sys/vm/overcommit_memorywe will get, after running the following program.int
main(){ int fd = open("/proc/sys/vm/overcommit_memory", O_RDWR) write(fd, "1", 1); write(fd, "2", 1); close(fd); }
write(fd, "2", 1)will pass *ppos = 1 toproc_dointvec_minmax.proc_dointvec_minmaxwill return 0 without settingnew_policy.t.data =
&new_policy;
ret =proc_dointvec_minmax(&t, write, buffer, lenp, ppos)-->do_proc_dointvec -->__do_proc_dointvec if (write) { if (proc_first_pos_non_zero_ignore(ppos, table)) goto out;
Quoted 6 lines
sysctl_overcommit_memory=new_policy;so
sysctl_overcommit_memorywill be set to an uninitialized value.Check whether
new_policyhas been changed byproc_dointvec_minmax.
Thanks. I added a cc:stable to this, so the fix will be backported into earlier kernels.
Kefeng Wang
Reviewed-byQuoted 8 lines · Andrew Morton
Quoted 6 lines · On Thu, 23 Sep 2021 02:05:24 +0000 Chen Jun <[email protected]> wrote:
An unexpected value of
/proc/sys/vm/overcommit_memorywe will get, after running the following program.int
main()
{
int fd =open("/proc/sys/vm/overcommit_memory", O_RDWR)
Hi Andrew,
missing ';' here,
Quoted 2 lines
Thanks. I added a cc:stable to this, so the fix will be backported into earlier kernels.
... and the Fixes tag miss a ')' in the end , please help to add them :)