lib/ioremap.c: avoid endless loop under ioremapping improper ranges
Subsystems (2)
PATCH 2/3 lib/ioremap.c: avoid endless loop under ioremapping improper ranges
From: zijun_hu <[email protected]>
for ioremap_page_range(), endless loop maybe happen if either of parameter addr and end is not page aligned, in order to fix this issue and hint range parameter requirements BUG_ON() checkup are performed firstly
for ioremap_pte_range(), loop end condition is optimized due to lack of relevant macro pte_addr_end()
--- lib/ioremap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
lib/ioremap.c +2 -1
@@ -64,7 +64,7 @@ static int ioremap_pte_range(pmd_t *pmd, unsigned long addr,BUG_ON (!pte_none (*pte));set_pte_at (&init_mm, addr, pte,pfn_pte (pfn, prot)); pfn++; - }while (pte++, addr +=PAGE_SIZE , addr != end); + }while (pte++, addr +=PAGE_SIZE , addr < end);return 0 ; }
@@ -129,6 +129,7 @@ int ioremap_page_range(unsigned long addr,int err;BUG_ON (addr >= end); +BUG_ON (!PAGE_ALIGNED (addr | end)); start = addr; phys_addr -= addr;
Signature · 1 line
1.9.1
Quoted 29 lines · zijun_hu
From:
zijun_hu<[email protected]>for
ioremap_page_range(), endless loop maybe happen if either of parameter addr and end is not page aligned, in order to fix this issue and hint range parameter requirementsBUG_ON()checkup are performed firstlyfor
ioremap_pte_range(), loop end condition is optimized due to lack of relevant macropte_addr_end()Signed-off-by zijun_hu <[email protected]>--- lib/ioremap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)lib/ioremap.c +1
-1@@ -64,7 +64,7 @@ static int ioremap_pte_range(pmd_t *pmd, unsigned long addr,BUG_ON (!pte_none (*pte));set_pte_at (&init_mm, addr, pte,pfn_pte (pfn, prot)); pfn++; - }while (pte++, addr +=PAGE_SIZE , addr != end); + }while (pte++, addr +=PAGE_SIZE , addr < end);return 0 ; }
lib/ioremap.c int ioremap_page_range(unsigned long addr, · line 135
Quoted 7 lines
lib/ioremap.c +1
-0@@ -129,6 +129,7 @@ int ioremap_page_range(unsigned long addr,int err;BUG_ON (addr >= end); +BUG_ON (!PAGE_ALIGNED (addr | end)); start = addr; phys_addr -= addr;
another approach is provided in another mail thread as below i don't known which is more appropriate
From: zijun_hu <[email protected]>
Subject: [PATCH 1/1] lib/ioremap.c: avoid endless loop under ioremapping page unaligned ranges
endless loop maybe happen if either of parameter addr and end is not page aligned for kernel API function ioremap_page_range()
in order to fix this issue and alert improper range parameters to user WARN_ON() checkup and rounding down range lower boundary are performed firstly, loop end condition within ioremap_pte_range() is optimized due to lack of relevant macro pte_addr_end()
--- lib/ioremap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
lib/ioremap.c +3 -1
@@ -64,7 +64,7 @@ static int ioremap_pte_range(pmd_t *pmd, unsigned long addr,BUG_ON (!pte_none (*pte));set_pte_at (&init_mm, addr, pte,pfn_pte (pfn, prot)); pfn++; - }while (pte++, addr +=PAGE_SIZE , addr != end); + }while (pte++, addr +=PAGE_SIZE , addr < end && addr >=PAGE_SIZE );return 0 ; }
@@ -129,7 +129,9 @@ int ioremap_page_range(unsigned long addr,int err;BUG_ON (addr >= end); +WARN_ON (!PAGE_ALIGNED (addr) || !PAGE_ALIGNED (end)); + addr =round_down (addr,PAGE_SIZE ); start = addr; phys_addr -= addr; pgd =pgd_offset_k (addr);
Signature · 8 lines
1.9.1 -- 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>