[PATCH] [nosys] ARM heap overflow check in libnosys

Richard Earnshaw rearnsha@arm.com
Fri Feb 28 10:30:00 GMT 2014


On 28/02/14 10:27, Richard Earnshaw wrote:
> On 27/02/14 04:43, Joey Ye wrote:
>> Original libnosys doesn't check heap overflow. This patch adds an ARM target
>> specific check there, without breaking other targets.
>>
>> OK to upstream?
>>
>>
>> ChangeLog (libgloss):
>>
>> 2014-02-27  Joey Ye  <joey.ye@arm.com>
>>         libnosys/sbrk.c (errno.h): New include.
>>         (errno): Redefine.
>>         (STACK_PTR): Define macro for __arm__.
>>         (_sbrk): Check STACK_PTR.
>>
> 
> I can't approve or reject this, since it's a change to generic code.
> However, some comments:
> 
> 1) You assume that the stack grows downwards and the heap upwards.  On
> some machines the stack can grow upwards.  I'm not sure if machines like
> this are interesting in this case.
> 2) You assume that there's a single stack and that the stack is not
> allocated within the heap (threaded code often does this)
> 3) It would be nice if the machine-specific definition could be moved
> out into a machine-specific header.
> 4) I don't think it's safe to undef errno like that.
> 

And one more:

5) You leave no grace space between the stack and the heap.  Unless you
are in the innermost frame at this time (deepest stack usage) you'll
likely later end up with a conflict when the stack moves down into the heap.

R.

> R.
> 
>> diff --git a/libgloss/libnosys/sbrk.c b/libgloss/libnosys/sbrk.c
>> index 86c130a..910db20 100644
>> --- a/libgloss/libnosys/sbrk.c
>> +++ b/libgloss/libnosys/sbrk.c
>> @@ -2,6 +2,16 @@
>>  
>>  #include "config.h"
>>  #include <_syslist.h>
>> +#include <errno.h>
>> +#undef errno
>> +extern int errno;
>> +
>> +#undef STACK_PTR
>> +#ifdef __arm__
>> +/* Register name faking - works in collusion with the linker.  */
>> +register char *stack_ptr asm ("sp");
>> +#define STACK_PTR stack_ptr
>> +#endif
>>  
>>  void *
>>  _sbrk (incr)
>> @@ -15,6 +25,15 @@ _sbrk (incr)
>>       heap_end = & end;
>>  
>>     prev_heap_end = heap_end;
>> +
>> +#ifdef STACK_PTR
>> +  if (heap_end + incr > STACK_PTR)
>> +    {
>> +      errno = ENOMEM;
>> +      return (void *) -1;
>> +    }
>> +#endif
>> +
>>     heap_end += incr;
>>  
>>     return (void *) prev_heap_end;=
>>
>>




More information about the Newlib mailing list