[PATCH] set errno for malloc failures

Jeff Johnston jjohnstn@redhat.com
Fri Oct 7 16:18:00 GMT 2005


Hi Bob,

  Thanks for the patch.  Some changes are required because the functions 
in mallocr are reentrant when built with INTERNAL_NEWLIB set on.  This 
means that the errno of the passed in reentrancy struct must be used to 
set errno in these situations.

  I'll modify the patch appropriately.

-- Jeff J.

Bob Wilson wrote:

> The malloc/realloc/memalign functions in newlib do not set errno when 
> they fail.  Here is a patch to correct the problem.
>
> 2005-10-06  Bob Wilson  <bob.wilson@acm.org>
>
>     * libc/stdlib/mallocr.c (mALLOc, rEALLOCc, mEMALIGn): Set errno
>     to ENOMEM on failure.
>
>------------------------------------------------------------------------
>
>Index: libc/stdlib/mallocr.c
>===================================================================
>RCS file: /cvs/src/src/newlib/libc/stdlib/mallocr.c,v
>retrieving revision 1.14
>diff -u -p -r1.14 mallocr.c
>--- libc/stdlib/mallocr.c	3 Jun 2005 18:57:30 -0000	1.14
>+++ libc/stdlib/mallocr.c	6 Oct 2005 20:00:47 -0000
>@@ -268,6 +268,7 @@ extern "C" {
> 
> #include <stdio.h>    /* needed for malloc_stats */
> #include <limits.h>   /* needed for overflow checks */
>+#include <errno.h>    /* needed to set errno to ENOMEM */
> 
> #ifdef WIN32
> #define WIN32_LEAN_AND_MEAN
>@@ -2341,7 +2342,10 @@ Void_t* mALLOc(RARG bytes) RDECL size_t 
> 
>   /* Check for overflow and just fail, if so. */
>   if (nb > INT_MAX || nb < bytes)
>+  {
>+    errno = ENOMEM;
>     return 0;
>+  }
> 
>   MALLOC_LOCK;
> 
>@@ -2804,7 +2808,10 @@ Void_t* rEALLOc(RARG oldmem, bytes) RDEC
> 
>   /* Check for overflow and just fail, if so. */
>   if (nb > INT_MAX || nb < bytes)
>+  {
>+    errno = ENOMEM;
>     return 0;
>+  }
> 
> #if HAVE_MMAP
>   if (chunk_is_mmapped(oldp)) 
>@@ -3037,7 +3044,10 @@ Void_t* mEMALIGn(RARG alignment, bytes) 
> 
>   /* Check for overflow. */
>   if (nb > INT_MAX || nb < bytes)
>+  {
>+    errno = ENOMEM;
>     return 0;
>+  }
> 
>   m  = (char*)(mALLOc(RCALL nb + alignment + MINSIZE));
> 
>  
>



More information about the Newlib mailing list