diff -urpPX nopatch linux-2.4.33/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c --- linux-2.4.33/arch/alpha/kernel/osf_sys.c Fri Jun 13 18:51:29 2003 +++ linux/arch/alpha/kernel/osf_sys.c Sat Aug 12 08:51:47 2006 @@ -1346,6 +1346,8 @@ arch_get_unmapped_area(struct file *filp if (len > limit) return -ENOMEM; + if (addr >= limit) + return -ENOMEM; /* First, see if the given suggestion fits. diff -urpPX nopatch linux-2.4.33/arch/sparc/kernel/sys_sparc.c linux/arch/sparc/kernel/sys_sparc.c --- linux-2.4.33/arch/sparc/kernel/sys_sparc.c Mon Aug 25 15:44:40 2003 +++ linux/arch/sparc/kernel/sys_sparc.c Sat Aug 12 08:51:47 2006 @@ -52,6 +52,8 @@ unsigned long arch_get_unmapped_area(str /* See asm-sparc/uaccess.h */ if (len > TASK_SIZE - PAGE_SIZE) return -ENOMEM; + if (addr >= TASK_SIZE - PAGE_SIZE) + return -ENOMEM; if (ARCH_SUN4C_SUN4 && len > 0x20000000) return -ENOMEM; if (!addr) diff -urpPX nopatch linux-2.4.33/arch/sparc64/kernel/sys_sparc.c linux/arch/sparc64/kernel/sys_sparc.c --- linux-2.4.33/arch/sparc64/kernel/sys_sparc.c Mon Aug 25 15:44:40 2003 +++ linux/arch/sparc64/kernel/sys_sparc.c Sat Aug 12 08:51:47 2006 @@ -63,6 +63,8 @@ unsigned long arch_get_unmapped_area(str task_size = 0xf0000000UL; if (len > task_size || len > -PAGE_OFFSET) return -ENOMEM; + if (addr >= task_size) + return -ENOMEM; if (!addr) addr = TASK_UNMAPPED_BASE; diff -urpPX nopatch linux-2.4.33/arch/x86_64/kernel/sys_x86_64.c linux/arch/x86_64/kernel/sys_x86_64.c --- linux-2.4.33/arch/x86_64/kernel/sys_x86_64.c Fri Nov 28 21:26:19 2003 +++ linux/arch/x86_64/kernel/sys_x86_64.c Sat Aug 12 08:51:47 2006 @@ -94,6 +94,8 @@ unsigned long arch_get_unmapped_area(str if (len > end) return -ENOMEM; addr = PAGE_ALIGN(addr); + if (addr >= end) + return -ENOMEM; for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { /* At this point: (!vma || addr < vma->vm_end). */