--- linux-2.4.19-gentoo-r10/mm/mremap.c 2004-02-23 14:26:57.000000000 -0600 +++ linux-2.4.19-gentoo-r10/mm/mremap.c 2004-02-23 14:30:30.000000000 -0600 @@ -268,7 +268,9 @@ if ((addr <= new_addr) && (addr+old_len) > new_addr) goto out; - do_munmap(current->mm, new_addr, new_len, 1); + ret = do_munmap(current->mm, new_addr, new_len, 1); + if (ret && new_len) + goto out; } /* @@ -276,9 +278,11 @@ * the unnecessary pages.. * do_munmap does all the needed commit accounting */ - ret = addr; if (old_len >= new_len) { - do_munmap(current->mm, addr+new_len, old_len - new_len, 1); + ret = do_munmap(current->mm, addr+new_len, old_len - new_len, 1); + if (ret && old_len != new_len) + goto out; + ret = addr; if (!(flags & MREMAP_FIXED) || (new_addr == addr)) goto out; }