Subject: Re: bug#17499: current dfa.c can malloc 0 bytes
From: Paul Eggert <[email-masked]>
To: Aharon Robbins <[email-masked]>
Cc: [email-masked]
Date: Thu, 15 May 2014 12:44:25 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

On 05/15/2014 10:34 AM, Aharon Robbins wrote:
> The wrapper only checks for NULL return.

Ah, thanks, that's the problem then: gawk's xmalloc is pickier than 
grep's, and the extra pickiness is incompatible with what dfa.c 
expects.  I see that gawk's xrealloc is also too picky, but gawk's 
xcalloc is OK.  Attached isa patch to gawk.  As this problem does not 
affect grep I'll close the grep bug.

From 77b003848b85f83537b3f618cb0a810447329500 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Thu, 15 May 2014 12:37:48 -0700
Subject: [PATCH] Port to systems where malloc (0) and/or realloc(P, 0) returns
 NULL.

* gawkmisc.c (xmalloc):
* xalloc.h (realloc):
Do not fail if malloc(0) or realloc(P, 0) returns NULL.
Fail only when the allocator returns null when attempting to
allocate a nonzero number of bytes.
---
 ChangeLog  | 9 +++++++++
 gawkmisc.c | 5 +++--
 xalloc.h   | 2 +-
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 45125c1..20dac99 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2014-05-15  Paul Eggert  <[email-masked]>
+
+	Port to systems where malloc (0) and/or realloc(P, 0) returns NULL.
+	* gawkmisc.c (xmalloc):
+	* xalloc.h (realloc):
+	Do not fail if malloc(0) or realloc(P, 0) returns NULL.
+	Fail only when the allocator returns null when attempting to
+	allocate a nonzero number of bytes.
+
 2014-05-14         Arnold D. Robbins     <[email-masked]>
 
 	* custom.h (_GL_PURE): Move definition to here. Sigh.
diff --git a/gawkmisc.c b/gawkmisc.c
index a729d88..fff5cc5 100644
--- a/gawkmisc.c
+++ b/gawkmisc.c
@@ -51,7 +51,8 @@ extern pointer xmalloc(size_t bytes);	/* get rid of gcc warning */
 pointer
 xmalloc(size_t bytes)
 {
-	pointer p;
-	emalloc(p, pointer, bytes, "xmalloc");
+	pointer p = malloc(bytes);
+	if (!p && bytes)
+		xalloc_die ();	  
 	return p;
 }
diff --git a/xalloc.h b/xalloc.h
index 0d169cf..5ee4516 100644
--- a/xalloc.h
+++ b/xalloc.h
@@ -156,7 +156,7 @@ void *
 xrealloc(void *p, size_t size)
 {
    void *new_p = realloc(p, size);
-   if (new_p ==  0)
+   if (!new_p && size)
      xalloc_die ();
 
    return new_p;
-- 
1.9.0