Commit: Use of alloca considered dangerous

Nick Clifton nickc@redhat.com
Mon Mar 21 17:34:00 GMT 2016


Hi Paul,

>>> I agree that alloca() needs bounds checks, but I don't see why you say that avoiding alloca entirely is "a good idea".
>> Based on what I've seen through the years, if you can't put a hard bounds on an alloca, then you're far better off from a security standpoint avoiding it completely.
> 
> Absolutely.  But isn't that a case by case test?  If 7 uses of alloca don't have a guaranteed hard bound but the 8th one does, then I agree the 7 have to change -- but would it not be reasonable to keep the 8th?

I only found two places where alloca was being used with a hard constant.
In both cases I replaced with just ordinary local array locations, like
this:

   if (sh_relax)
     {
       static int count = 0;
+      char name[11];
 
       /* If the last loop insn is a two-byte-insn, it is in danger of being
 	 swapped with the insn after it.  To prevent this, create a new

replacing:

       /* A REPEAT takes 6 bytes.  The SH has a 32 bit address space.
 	 Hence a 9 digit number should be enough to count all REPEATs.  */
-      name = alloca (11);
       sprintf (name, "_R%x", count++ & 0x3fffffff);


and:

   static void
   msp430_set_arch (int option)
   {
  -  char *str = (char *) alloca (32);	/* 32 for good measure.  */
  +  char str[32];	/* 32 for good measure.  */
 

That was it.  All the other uses of alloca had dynamically computed sizes 
which, at least theorertically, could be exploited.

Cheers
  Nick
 



More information about the Binutils mailing list