[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