#include <unistd.h>
#include "libbb.h"
-/* same conditions as recursive_action */
-#define bb_need_memory_exhausted
-#define BB_DECLARE_EXTERN
-#include "../messages.c"
-
#ifndef DMALLOC
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;