[libvirt] Bug in RPC code causes failure to start LXC container using virDomainCreateXMLWithFiles
Martin Kletzander
mkletzan at redhat.com
Tue Jan 12 07:46:01 UTC 2016
On Thu, Nov 26, 2015 at 04:10:40PM +0000, Ben Gray wrote:
>Hi,
>
> Occasionally when trying to start LXC containers with fds I get
>the following error:
>
Wow, this is here for a while... Sorry for the delay.
> virNetMessageDupFD:562 : Unable to duplicate FD -1: Bad file
>descriptor
>
It's weird that there's '-1', though. But I might just missed something
when re-tracking what you did.
> I tracked it down to the code that handles EAGAIN errors from
>recvfd. In such cases the virNetMessageDecodeNumFDs function may be
>called multiple times from virNetServerClientDispatchRead and each
>time it overwrites the msg->fds array. In the best case (when
>msg->donefds == 0) this results in a memory leak, in the worse case it
>will leak any fd's already in msg->fds and cause subsequent failures
>when dup is called.
>
It is a problem indeed. I'm testing your patch now, but without
reproducing the issue it's going to be a bit blind test. I don't
suppose there is easier to reproduce this other than connecting through
pv or socat that limits the block size and speed sent and then try
starting a container with bunch of FDs, right?
> A very similar problem is mention here: https://www.redhat.com/archives/libvir-list/2012-December/msg01306.html
>
>
> Below is my patch to fix the issue.
>
>
>
>--- a/src/rpc/virnetserverclient.c 2015-01-23 11:46:24.000000000 +0000
>+++ b/src/rpc/virnetserverclient.c 2015-11-26 15:30:51.214462290 +0000
>@@ -1107,36 +1107,40 @@
>
> /* Now figure out if we need to read more data to get some
> * file descriptors */
>- if (msg->header.type == VIR_NET_CALL_WITH_FDS &&
>- virNetMessageDecodeNumFDs(msg) < 0) {
>- virNetMessageQueueServe(&client->rx);
>- virNetMessageFree(msg);
>- client->wantClose = true;
>- return; /* Error */
>- }
>+ if (msg->header.type == VIR_NET_CALL_WITH_FDS) {
>+ size_t i;
>
This is already here, it will shadow another local declaration.
Anyway, it's worth to mention that this patch does very little
functional change and is good to be viewed with '-w'.
I'm fairly sure we want to have this fixed and even though the freeze
for 1.3.1 started today, this fixes a bug and was sent long ago, so I
think it's fine if it goes in. But since this does not apply to current
master, I moved the code in a similar fashion (actually the same way, I
don't know why it didn't apply). I'll also reword the message and then
I'll push it. Thanks for the fix and congratulations to your first
patch in libvirt ;)
Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160112/fc7a2739/attachment-0001.sig>
More information about the libvir-list
mailing list