Hi,
I think I've found a possible situation where we call two times free on the
same pointer.
in sysexec() there is essentially
sysexec(...) {
…
if(waserror()){
free(file0);
free(elem);
nexterror();
}
for(;;){
tc = namec(file, Aopen, OEXEC, 0);
if(waserror()){
cclose(tc);
nexterror();
}
…
}
qlock(&up->seglock);
if(waserror()){
qunlock(&up->seglock);
nexterror();
}
…
free(file0);
+ file0 = nil; <------------------------- we should add that, for the same
reason we do elem = nil below
free(up->text);
up->text = elem;
elem = nil; /* so waserror() won't free elem */
USED(elem);
…
qunlock(&up->seglock);
poperror(); /* seglock */
- poperror(); /* elem */ <----------------------- actually this is
not the poperror of elem, but of tc
…
poperror();
cclose(tc);
+ poperror(); /* elem and file0 */ <----------- this is where the poperror
of elem should be.
}