[Patch] Fix another unbound alloca (BZ 13761)

Jeff Law law@redhat.com
Mon Jul 2 21:45:00 GMT 2012


On 06/22/2012 04:14 PM, Roland McGrath wrote:
> You've added a "free (dataset);" call, but DATASET is never malloc'd.
> If it's not alloca'd, it's from mempool_alloc.
>
> I don't understand the nscd code well enough off hand to be sure it's
> appropriate to use mempool_alloc for whatever the "(he != NULL)" case
> means.  If it is, then you don't need to free it because those pools are
> GC'd--so you need less change than you did, the 'alloca_used' variable is
> fine as it was.  If it's not, then you need to use malloc for the new third
> case (he != NULL && !__libc_use_alloca (...)), handle that error case
> somehow, and do yet more bookkeeping to free it only when you used malloc.
It seems to me that freeing dataset is just wrong if it's allocated via 
mempool_alloc and things in mempool_alloc are GC'd.

ISTM the safe thing to do would be something like:

      if (he == NULL)
         dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
      else if (! __libc_use_alloca (alloca_used + total + n))
         dataset = (struct dataset *) malloc (...);


And just track when dataset is explicitly malloc'd, freeing dataset in 
that case and that case only.  For the code which conditionally adds the 
record to the database, do not add it in the case where the record was 
allocated via malloc (as we free it).  That's obviously safe as we only 
malloc in a subset of the cases where we used to alloca.

While it might be safe/appropriate to use mempools in the case where the 
needed space is large and transient, it's hard to prove.

Thoughts?

jeff



More information about the Libc-alpha mailing list