Ver código fonte

Add in a MALLOC_GLIBC_COMPAT option to let people decide if they
want glibc style malloc(0) behavior

Eric Andersen 21 anos atrás
pai
commit
a4ba059034

+ 18 - 1
extra/Configs/Config.in

@@ -195,11 +195,28 @@ config MALLOC_930716
 
 endchoice
 
+config MALLOC_GLIBC_COMPAT
+	bool "Malloc returns live pointer for malloc(0)"
+	default n
+	help
+	  The behavior of malloc(0) is listed as implementation-defined by
+	  SuSv3.  Glibc returns a valid pointer to something, while uClibc
+	  normally return a NULL.  I personally feel glibc's behavior is
+	  not particularly safe, and allows buggy applications to hide very
+	  serious problems.
+
+	  When this option is enabled, uClibc will act just like glibc, and
+	  return a live pointer when someone calls malloc(0).  This pointer
+	  provides a malloc'ed area with a size of 1 byte.  This feature is
+	  mostly useful when dealing with applications using autoconf's broken
+	  AC_FUNC_MALLOC macro (which  redefines malloc as rpl_malloc if it
+	  does not detect glibc style returning-a-valid-pointer-for-malloc(0)
+	  behavior).  Most people can safely answer N.
+
 config UCLIBC_DYNAMIC_ATEXIT
 	bool "Dynamic atexit() Support"
 	default y
 	help
-
 	  When this option is enabled, uClibc will support an infinite number,
 	  of atexit() and on_exit() functions, limited only by your available
 	  memory.  This can be important when uClibc is used with C++, since

+ 5 - 0
libc/stdlib/malloc-930716/malloc.c

@@ -160,9 +160,14 @@ void * __malloc_unlocked (size_t size)
     size_t log, block, blocks, i, lastblocks, start;
     struct list *next;
 
+#if defined(__MALLOC_GLIBC_COMPAT__)
+    if (size == 0)
+	size++;
+#else
     /* Some programs will call malloc (0).  Lets be strict and return NULL */
     if (size == 0)
 	return NULL;
+#endif
 
     if (size < sizeof (struct list))
 	size = sizeof (struct list);

+ 5 - 0
libc/stdlib/malloc/malloc.c

@@ -184,8 +184,13 @@ malloc (size_t size)
     __heap_check (&__malloc_heap, "malloc");
 #endif
 
+#if defined(__MALLOC_GLIBC_COMPAT__)
   if (size == 0)
     return 0;
+#else
+  if (size == 0)
+      size++;
+#endif
 
   return malloc_from_heap (size, &__malloc_heap);
 }