Skip to contentSkip to conversation

lib/ioremap.c: avoid endless loop under ioremapping improper ranges

PATCH Superseded zijun_hu 1 participant 2 messages Sep 20, 2016 – Sep 21, 2016

Subsystems (2)
lore
Share & tools
lore

zijun_hu

author
#0 lore raw

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
index 86c8911..0058cc8 100644
@@ -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
author
#1 lore raw
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 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 +1 -1
index 86c8911..0058cc8 100644
@@ -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
index 86c8911..911bdca 100644
@@ -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>