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.