mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
mm, memcg: fix potential undefined behavior in mem_cgroup_event_ratelimit()
Alice has reported the following UBSAN splat: UBSAN: Undefined behaviour in mm/memcontrol.c:661:17 signed integer overflow: -2147483644 - 2147483525 cannot be represented in type 'long int' CPU: 1 PID: 11758 Comm: mybibtex2filena Tainted: P O 4.9.25-gentoo #4 Hardware name: XXXXXX, BIOS YYYYYY Call Trace: dump_stack+0x59/0x87 ubsan_epilogue+0xe/0x40 handle_overflow+0xbb/0xf0 __ubsan_handle_sub_overflow+0x12/0x20 memcg_check_events.isra.36+0x223/0x360 mem_cgroup_commit_charge+0x55/0x140 wp_page_copy+0x34e/0xb80 do_wp_page+0x1e6/0x1300 handle_mm_fault+0x88b/0x1990 __do_page_fault+0x2de/0x8a0 do_page_fault+0x1a/0x20 error_code+0x67/0x6c The reason is that we subtract two signed types. Let's fix this by truly mimicing time_after and cast the result of the subtraction. Link: http://lkml.kernel.org/r/20170616150057.GQ30580@dhcp22.suse.cz Signed-off-by: Michal Hocko <mhocko@suse.com> Reported-by: Alice Ferrazzi <alicef@gentoo.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
69ed779a14
commit
6a1a8b8072
@ -631,7 +631,7 @@ static bool mem_cgroup_event_ratelimit(struct mem_cgroup *memcg,
|
|||||||
val = __this_cpu_read(memcg->stat->nr_page_events);
|
val = __this_cpu_read(memcg->stat->nr_page_events);
|
||||||
next = __this_cpu_read(memcg->stat->targets[target]);
|
next = __this_cpu_read(memcg->stat->targets[target]);
|
||||||
/* from time_after() in jiffies.h */
|
/* from time_after() in jiffies.h */
|
||||||
if ((long)next - (long)val < 0) {
|
if ((long)(next - val) < 0) {
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case MEM_CGROUP_TARGET_THRESH:
|
case MEM_CGROUP_TARGET_THRESH:
|
||||||
next = val + THRESHOLDS_EVENTS_TARGET;
|
next = val + THRESHOLDS_EVENTS_TARGET;
|
||||||
|
Loading…
Reference in New Issue
Block a user