The code was already careful not to use malloc/free
for stack growth during calls to malloc.
Avoid them during calls to free too.
R=r
DELTA=9  (7 added, 0 deleted, 2 changed)
OCL=29606
CL=29610
        uint32 *ref;
 
        if(m->mallocing)
-               throw("malloc - deadlock");
+               throw("malloc/free - deadlock");
        m->mallocing = 1;
 
        if(size == 0)
        if(v == nil)
                return;
 
+       if(m->mallocing)
+               throw("malloc/free - deadlock");
+       m->mallocing = 1;
+
        mlookup(v, nil, nil, &ref);
        *ref = RefFree;
 
                        mstats.alloc -= s->npages<<PageShift;
                        sys_memclr(v, s->npages<<PageShift);
                        MHeap_Free(&mheap, s);
-                       return;
+                       goto out;
                }
                MHeapMapCache_SET(&mheap.mapcache, page, sizeclass);
        }
        sys_memclr(v, size);
        mstats.alloc -= size;
        MCache_Free(c, v, sizeclass, size);
+
+out:
+       m->mallocing = 0;
 }
 
 int32