--- 2.3.14-pre2-rawio/mm/memory.c.~1~ Thu Aug 12 02:53:25 1999 +++ 2.3.14-pre2-rawio/mm/memory.c Fri Aug 20 13:21:36 1999 @@ -411,18 +411,17 @@ * Given a physical address, is there a useful struct page pointing to it? */ -static struct page * get_page_map(unsigned long page) +static int get_page_map(unsigned long page, struct page ** map) { - struct page *map; - + *map = NULL; if (MAP_NR(page) >= max_mapnr) - return 0; + return 1; if (page == ZERO_PAGE(page)) return 0; - map = mem_map + MAP_NR(page); - if (PageReserved(map)) + *map = mem_map + MAP_NR(page); + if (PageReserved(*map)) return 0; - return map; + return 1; } /* @@ -484,7 +483,12 @@ map = NULL; goto retry; } - map = get_page_map(page); + if (!get_page_map(page, &map)) + { + dprintk(KERN_WARNING + "Forbidden page_map in map_user_kiobuf\n"); + goto out_unlock_page_table; + } if (map) { if (TryLockPage(map)) { goto retry; @@ -504,6 +508,8 @@ dprintk ("map_user_kiobuf: end OK\n"); return 0; + out_unlock_page_table: + spin_unlock(&mm->page_table_lock); out_unlock: up(&mm->mmap_sem); unmap_kiobuf(iobuf);