about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/mem.c18
2 files changed, 22 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 82630e530..c581b8679 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-30  Peter Stephenson  <pws@csr.com>
+
+	* 23339: Src/mem.c: make malloc(0) allocate a single byte
+	instead of returning invalid (and unfreeable) memory.
+
 2007-04-27  Peter Stephenson  <pws@csr.com>
 
 	* 23337: Src/Zle/compctl.c: argument to stat() wasn't
diff --git a/Src/mem.c b/Src/mem.c
index afc008cd7..448c4aad9 100644
--- a/Src/mem.c
+++ b/Src/mem.c
@@ -830,10 +830,26 @@ malloc(MALLOC_ARG_T size)
 #endif
 
     /* some systems want malloc to return the highest valid address plus one
-       if it is called with an argument of zero */
+       if it is called with an argument of zero.
+    
+       TODO: really?  Suppose we allocate more memory, so
+       that this is now in bounds, then a more rational application
+       that thinks it can free() anything it malloc'ed, even
+       of zero length, calls free for it?  Aren't we in big
+       trouble?  Wouldn't it be safer just to allocate some
+       memory anyway?
+
+       If the above comment is really correct, then at least
+       we need to check in free() if we're freeing memory
+       at m_high.
+    */
 
     if (!size)
+#if 1
+	size = 1;
+#else
 	return (MALLOC_RET_T) m_high;
+#endif
 
     queue_signals();  /* just queue signals rather than handling them */