[Libvir] Re: Lxc conf patch
Dave Leskovec
dlesko at linux.vnet.ibm.com
Mon Mar 31 22:06:32 UTC 2008
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
More information about the libvir-list
mailing list