This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] set errno for malloc failures


Modified patch checked in.

-- Jeff J.

Jeff Johnston wrote:

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));






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]