[libvirt] PATCH: Fix multiple bugs in RPC handling

Jim Meyering jim at meyering.net
Fri Feb 6 14:21:59 UTC 2009


"Daniel P. Berrange" <berrange at redhat.com> wrote:

> A number of bugs conspired together to cause some nasty problems when
> a QEMU vm failed to start
>
>  - vm->monitor was not initialized to -1, so when a VM failed to start
>    the vm->monitor was just '0', and thus we closed FD 0 (libvirtd's stdin)
>
>  - The next client to connect got FD 0 as its socket
>
>  - The first bug struck again, causing the client to be closed even
>    though libvirt thought it was still open
>
>  - libvirtd now polle on FD=0, which gave back POLLNVAL because it was
>    closed
>
>  - event.c was not looking for POLLNVAL so it span 100% cpu when this
>    happened, instead of invoking the callback with an error code
>
>  - virsh was not cleaning up the priv->watiDispatch call upon I/O errors,
>    so virsh then hung when doing virConenctClose

It could also segfault, and it was easy to make it do that
for me, every third client call.  For reference, here's what I did:

LIBVIRT_DEBUG=1 qemud/libvirtd > log 2>&1 &
cat <<\EOF > e.xml
<domain type='qemu'>
  <name>E</name>
  <uuid>d7a5fdbd-cdaf-9455-926a-d65c16db1809</uuid>
  <memory>219200</memory>
  <currentMemory>219200</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch='i686' machine='pc'>hvm</type>
    <boot dev='cdrom'/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='cdrom'>
      <source file='NO_SUCH_FILE'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
  </devices>
</domain>
EOF

  $ src/virsh create e.xml
  libvir: Remote error : no call waiting for reply with serial 3
  error: failed to connect to the hypervisor
  [Exit 1]
  $ src/virsh create e.xml
  libvir: Remote error : no call waiting for reply with serial 0
  error: failed to connect to the hypervisor
  [Exit 1]
  $ src/virsh create e.xml
  libvir: Remote error : server closed connection
  error: Failed to create domain from e.xml

  zsh: segmentation fault  src/virsh create e.xml

FYI, that was due to this code

    remote_internal.c:6319, while (tmp && tmp->next)

where "tmp" is bogus because priv->waitDispatch was freed.

Note that this was probably easier for me than most,
since I have this in my environment:

  export MALLOC_PERTURB_=$(($RANDOM % 255 + 1))

> This patch does 3 things
>
>  - Treats POLLNVAL as VIR_EVENT_HANDLE_ERROR, so the callback gets
>    to see the error & de-registers the client from the event loop
>  - Add the missing initialization of vm->monitor
>  - Fix remote_internal.c handling of I/O errors

ACK.




More information about the libvir-list mailing list