Subject: Re: bug#17499: current dfa.c can malloc 0 bytes

From: Paul Eggert <[email-masked]>
Date: Thu, 15 May 2014 12:44:25 -0700

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