From: IWAMOTO Toshihiro <iwamoto@valinux.co.jp>

I found linux-2.6.0-test11 leaks memory when execve fails.  I've also
checked the bitkeeper tree and the problem seems to be unchanged.

The attached patch is a partial backout of bitkeeper rev.  1.87 of
fs/exec.c.  I guess the original change was a simple mistake. 
(free_arg_pages() is a NOP when CONFIG_MMU is defined).



 fs/exec.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletion(-)

diff -puN fs/exec.c~execve-memleak-fix fs/exec.c
--- 25/fs/exec.c~execve-memleak-fix	2003-12-22 01:29:29.000000000 -0800
+++ 25-akpm/fs/exec.c	2003-12-22 01:29:29.000000000 -0800
@@ -1085,6 +1085,7 @@ int do_execve(char * filename,
 	struct linux_binprm bprm;
 	struct file *file;
 	int retval;
+	int i;
 
 	sched_balance_exec();
 
@@ -1153,7 +1154,11 @@ int do_execve(char * filename,
 
 out:
 	/* Something went wrong, return the inode and free the argument pages*/
-	free_arg_pages(&bprm);
+	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+		struct page * page = bprm.page[i];
+		if (page)
+			__free_page(page);
+	}
 
 	if (bprm.security)
 		security_bprm_free(&bprm);

_