Skip to contentSkip to conversation

mm: make apply_to_page_range more robust

PATCH Superseded Mika Penttilä 3 participants 3 messages Jan 20, 2016 – Jan 21, 2016

Subsystems (2)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 mm: make apply_to_page_range more robust

Recent changes (4.4.0+) in module loader triggered oops on ARM.

can be 0 triggering the bug BUG_ON(addr >= end);.

The call path is SyS_init_module()->set_memory_xx()->apply_to_page_range(), and apply_to_page_range gets zero length resulting in triggering :

BUG_ON(addr >= end)

This is a consequence of changes in module section handling (Rusty CC:ed). This may be triggable only with certain modules and/or gcc versions.

Plus, I think the spirit of the BUG_ON is to catch overflows, not to bug on zero length legitimate callers. So whatever the reason for this triggering, some day we have another caller with zero length.

Fix by letting call with zero size succeed.

v2: add more explanation

---

mm/memory.c +3 -0
index c387430..c3d1a2e 100644
@@ -1884,6 +1884,9 @@ int apply_to_page_range(struct mm_struct *mm, unsigned long addr,
        unsigned long end = addr + size;
        int err;
 
+       if (!size)
+               return 0;
+
        BUG_ON(addr >= end);
        pgd = pgd_offset(mm, addr);
        do {

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

#1 lore raw
Quoted 4 lines · Mika PenttilA?

Recent changes (4.4.0+) in module loader triggered oops on ARM.

can be 0 triggering the bug BUG_ON(addr >= end);.

Quoted 8 lines

The call path is SyS_init_module()->set_memory_xx()->apply_to_page_range(), and apply_to_page_range gets zero length resulting in triggering :

BUG_ON(addr >= end)

This is a consequence of changes in module section handling (Rusty CC:ed). This may be triggable only with certain modules and/or gcc versions.

Well, what module are you loading to cause this crash? Why would it be passing size == 0 to apply_to_page_range()? Again, that sounds like a problem that we _want_ to know about since it is probably the result of buggy code and this patch would be covering it up.

Please elaborate on the problem that you are seeing, preferably with a stack trace of the BUG so we can fix the problem instead of papering over it.

#2 lore raw
Quoted 11 lines · David Rientjes
Quoted 9 lines · Mika Penttilä

Recent changes (4.4.0+) in module loader triggered oops on ARM.

can be 0 triggering the bug BUG_ON(addr >= end);.

The call path is SyS_init_module()->set_memory_xx()->apply_to_page_range(), and apply_to_page_range gets zero length resulting in triggering :

BUG_ON(addr >= end)

Quoted 8 lines
Quoted 3 lines

This is a consequence of changes in module section handling (Rusty CC:ed). This may be triggable only with certain modules and/or gcc versions.

Well, what module are you loading to cause this crash? Why would it be passing size == 0 to apply_to_page_range()? Again, that sounds like a problem that we _want_ to know about since it is probably the result of buggy code and this patch would be covering it up.

Yes, I'm curious too. It's certainly possible, since I expected a zero-length range to do nothing, but let's make sure we're not papering over some other screwup of mine.

Thanks,
Rusty.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>