svn commit: trunk/uClibc/libc/unistd

vapier at uclibc.org vapier at uclibc.org
Sat Dec 22 12:18:46 UTC 2007


Author: vapier
Date: 2007-12-22 04:18:44 -0800 (Sat, 22 Dec 2007)
New Revision: 20665

Log:
plug a memory leak when using execl* functions on no-mmu

Modified:
   trunk/uClibc/libc/unistd/exec.c


Changeset:
Modified: trunk/uClibc/libc/unistd/exec.c
===================================================================
--- trunk/uClibc/libc/unistd/exec.c	2007-12-22 06:28:23 UTC (rev 20664)
+++ trunk/uClibc/libc/unistd/exec.c	2007-12-22 12:18:44 UTC (rev 20665)
@@ -56,7 +56,9 @@
 /* We do not have an MMU, so using alloca() is not an option.
  * Less obviously, using malloc() is not an option either since
  * malloc()ed memory can leak in a vfork() and exec*() situation.
- * Therefore, we must use mmap() and unmap() directly.
+ * Therefore, we must use mmap() and unmap() directly, caching
+ * the result as we go.  This way we minimize the leak to 1
+ * allocation.
  */
 
 # define EXEC_ALLOC_SIZE(VAR)	size_t VAR;	/* Semicolon included! */
@@ -68,22 +70,28 @@
 
 # ifdef L___exec_alloc
 
+void attribute_hidden __exec_free(void *ptr, size_t size)
+{
+	if (ptr)
+		munmap(ptr, size);
+}
+
 void attribute_hidden *__exec_alloc(size_t size)
 {
-	void *p;
+	static void *p;
+	static size_t old_size;
 
+	if (old_size >= size)
+		return p;
+	else
+		__exec_free(p, old_size);
+
+	old_size = size;
 	p = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
 
 	return (p != MAP_FAILED) ? p : NULL;
 }
 
-void attribute_hidden __exec_free(void *ptr, size_t size)
-{
-	if (ptr) {
-		munmap(ptr, size);
-	}
-}
-
 # endif
 
 #endif




More information about the uClibc-cvs mailing list