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