[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