Otto Moerbeek wrote:
>  static void
> -ofree(struct dir_info *pool, void *p)
> +ofree(struct dir_info *argpool, void *p)
>  {
> +     struct dir_info *pool;
>       struct region_info *r;
>       size_t sz;
> +     int i;
>  
> +     pool = argpool;
>       r = find(pool, p);
>       if (r == NULL) {
> -             wrterror(pool, "bogus pointer (double free?)", p);
> -             return;
> +             for (i = 0; i < _MALLOC_MUTEXES; i++) {
> +                     if (i == pool->mutex)
> +                             continue;
> +                     pool->active--;
> +                     _MALLOC_UNLOCK(pool->mutex);
> +                     pool = mopts.malloc_pool[i];
> +                     _MALLOC_LOCK(pool->mutex);
> +                     pool->active++;
> +                     r = find(pool, p);
> +                     if (r != NULL)
> +                             break;
> +             }       
> +             if (r == NULL) {
> +                     wrterror(pool, "bogus pointer (double free?)", p);
> +                     goto done;
> +             }

I'm having trouble understanding this loop. I think you are trying to avoid
locking the initial pool again. but this only works if argpool is 0. if it's
something else, then pool will change, and pool->mutex will never equal i.

Reply via email to