
Daniel Veillard wrote:
Okay, that's something i promised last week, but it has some significant changes: - cleanup the XPath methods to access the XML informations, reusing the existing methods from xml.h - make string fields from __lxc_vm_def dynamic (except the UUID) - fix what looked like a funny leak situation when vm def structures were deallocated (see changes around lxcFreeVM/lxcFreeVMs/lxcFreeVMDef), i hope i didn't overlooked something but valgrind seems happy now leak wise. Overall it looks a bit simpler to me :-)
I agree :-)
Valgrind only report left is ==1== Invalid write of size 4 ==1== at 0x470C8C: lxcCheckContainerSupport (lxc_driver.c:91) ==1== Address 0xFFFFFFFFFFFFFFEC is not stack'd, malloc'd or (recently) free'd ==1== ==1== Process terminating with default action of signal 11 (SIGSEGV) ==1== Access not within mapped region at address 0xFFFFFFFFFFFFFFEC ==1== at 0x470C8C: lxcCheckContainerSupport (lxc_driver.c:91)
which is related to the probe code of the driver --------------------------- stack = malloc(getpagesize() * 4); if(!stack) { DEBUG0("Unable to allocate stack"); rc = -1; goto check_complete; }
childStack = stack + (getpagesize() * 4);
cpid = clone(lxcDummyChild, childStack, flags, NULL); --------------------------- I would assume it's valgrind being a bit pedantic because we pass the address just over the allocated stack limit, which should be fine since stack is addressed in predecrementing mode (BTW isn't that a portability bug in the code stack direction should probably be checked no ?).
This sounds like a pretty uncommon case - only the HP PA-RISC that I've found. This could certainly be addressed though...
Still maybe it's a good idea to pass a pointer in the allocated area ...
This could be done with a small loss (looks like 16 bytes) of stack space.
Daniel
void lxcFreeVMs(lxc_vm_t *vms) *************** void lxcFreeVMs(lxc_vm_t *vms) *** 859,865 **** while (curVm) { lxcFreeVM(curVm); nextVm = curVm->next; - free(curVm); curVm = nextVm; } } [...] --- 819,825 ---- void lxcFreeVM(lxc_vm_t *vm) { lxcFreeVMDef(vm->def); ! free(vm); }
This breaks doesn't it? After calling lxcFreeVM(), curVm is no longer valid since it was free()'d. Need to pull out the next pointer before lxcFreeVM(). -- Best Regards, Dave Leskovec IBM Linux Technology Center Open Virtualization