[uClibc] malloc-simple munmap fix

Yoshinori Sato ysato at users.sourceforge.jp
Mon Jun 6 15:13:48 UTC 2005


Don't forgive that length of munmap is "0" in current nommu.
This purpose cannot free memory area really.
It is a patch to work out a solution.

--- alloc.c~	2005-06-06 15:10:21.000000000 +0900
+++ alloc.c	2005-06-07 00:02:51.000000000 +0900
@@ -32,19 +32,17 @@
     }
 
 #ifdef __ARCH_HAS_MMU__
+#define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS
+#else
+#define MMAP_FLAGS MAP_SHARED | MAP_ANONYMOUS
+#endif
+
     result = mmap((void *) 0, size + sizeof(size_t), PROT_READ | PROT_WRITE,
-	    MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+	    MMAP_FLAGS, 0, 0);
     if (result == MAP_FAILED)
 	return 0;
     * (size_t *) result = size;
     return(result + sizeof(size_t));
-#else
-    result = mmap((void *) 0, size, PROT_READ | PROT_WRITE,
-	    MAP_SHARED | MAP_ANONYMOUS, 0, 0);
-    if (result == MAP_FAILED)
-	return 0;
-    return(result);
-#endif
 }
 #endif
 
@@ -88,11 +86,7 @@
     newptr = malloc(size);
     if (newptr) {
 	memcpy(newptr, ptr,
-#ifdef __ARCH_HAS_MMU__
 		*((size_t *) (ptr - sizeof(size_t)))
-#else
-		size
-#endif
 	      );
 	free(ptr);
     }
@@ -111,12 +105,8 @@
 	    return;
 	}
     }
-#ifdef __ARCH_HAS_MMU__
     ptr -= sizeof(size_t);
     munmap(ptr, * (size_t *) ptr + sizeof(size_t));
-#else
-    munmap(ptr, 0);
-#endif
 }
 #endif
 
@@ -154,12 +144,8 @@
 	    /* Mark the block as free */
 	    l->aligned = NULL;
 	    ptr = l->exact;
-#ifdef __ARCH_HAS_MMU__
 	    ptr -= sizeof(size_t);
 	    munmap(ptr, * (size_t *) ptr + sizeof(size_t));
-#else
-	    munmap(ptr, 0);
-#endif
 	    return 1;
 	}
     }

-- 
Yoshinori Sato
<ysato at users.sourceforge.jp>



More information about the uClibc mailing list