From 029b4a04221794101812407f5c60155bdfdd1481 Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Thu, 28 Jun 2001 21:22:19 +0000
Subject: Allow xrealloc to act as a free() when size=0, per SuS2.  -Erik

---
 libbb/xfuncs.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index f3b294be2..eb93bf139 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -44,7 +44,17 @@ extern void *xmalloc(size_t size)
 
 extern void *xrealloc(void *old, size_t size)
 {
-	void *ptr = realloc(old, size);
+	void *ptr;
+
+	/* SuS2 says "If size is 0 and ptr is not a null pointer, the
+	 * object pointed to is freed."  Do that here, in case realloc
+	 * returns a NULL, since we don't want to choke in that case. */
+	if (size==0 && old) {
+		free(old);
+		return NULL;
+	}
+
+	ptr = realloc(old, size);
 	if (!ptr)
 		error_msg_and_die(memory_exhausted);
 	return ptr;
-- 
cgit v1.2.3