1. 13 1月, 2014 1 次提交
    • J
      Don't crash if a connection closes early · 173c2914
      Jiri Denemark 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1047577
      
      When a client closes its connection to libvirtd early during
      virConnectOpen, more specifically just after making
      REMOTE_PROC_CONNECT_SUPPORTS_FEATURE call to check if
      VIR_DRV_FEATURE_PROGRAM_KEEPALIVE is supported without even waiting for
      the result, libvirtd may crash due to a race in keep-alive
      initialization. Once receiving the REMOTE_PROC_CONNECT_SUPPORTS_FEATURE
      call, the daemon's event loop delegates it to a worker thread. In case
      the event loop detects EOF on the connection and calls
      virNetServerClientClose before the worker thread starts to handle
      REMOTE_PROC_CONNECT_SUPPORTS_FEATURE call, client->keepalive will be
      disposed by the time virNetServerClientStartKeepAlive gets called from
      remoteDispatchConnectSupportsFeature. Because the flow is common for
      both authenticated and read-only connections, even unprivileged clients
      may cause the daemon to crash.
      
      To avoid the crash, virNetServerClientStartKeepAlive needs to check if
      the connection is still open before starting keep-alive protocol.
      
      Every libvirt release since 0.9.8 is affected by this bug.
      173c2914
  2. 11 1月, 2014 2 次提交
    • D
      Exercise the ABI stability check code in test suite · 53a699a0
      Daniel P. Berrange 提交于
      Any test suite which involves a virDomainDefPtr should
      call virDomainDefCheckABIStability with itself just as
      a basic sanity check that the identity-comparison always
      succeeds. This would have caught the recent NULL pointer
      access crash.
      
      Make sure we cope with def->name being NULL since the
      VMWare config parser produces NULL names.
      Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
      53a699a0
    • E
      schema: fix idmap validation · dd0dda2e
      Eric Blake 提交于
      When idmap was added to LXC, we forgot to cover it in the testsuite.
      The schema was missing an <element> layer, and as a result,
      virt-xml-validate was failing on valid dumpxml output.
      
      Reported by Eduard - Gabriel Munteanu on IRC.
      
      * docs/schemas/domaincommon.rng (idmap): Include <idmap> element,
      and support interleaves.
      * tests/lxcxml2xmldata/lxc-idmap.xml: New file.
      * tests/lxcxml2xmltest.c (mymain): Test it.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      dd0dda2e
  3. 10 1月, 2014 11 次提交
    • P
      storage: Improve error message when a storage backend is missing · 558ffad5
      Peter Krempa 提交于
      Include the name of the storage backend in the error message instead of
      just the number.
      558ffad5
    • P
      storage: lvm: Avoid forward decl of virStorageBackendLogicalDeleteVol · af38f830
      Peter Krempa 提交于
      Change code ordering to avoid the need for a forward declaration.
      af38f830
    • P
      storage: fs: Fix comment for virStorageBackendFileSystemDelete · 1c0e2b60
      Peter Krempa 提交于
      The comment was talking about creating the pool while the function is
      deleting it. Fix the mismatch.
      1c0e2b60
    • C
      c4dadf23
    • E
      event: don't queue NULL event on OOM · f86e4630
      Eric Blake 提交于
      Ever since commit 61ac8ce0, Coverity complained about
      remoteNetworkBuildEventLifecycle not checking for NULL failure
      to build an event, compared to other calls in the code base.
      But the problem is latent from copy and paste; all 17 of our
      remote*BuildEvent* functions in remote_driver.c have the same
      issue - if an OOM causes an event to not be built, we happily
      pass NULL to remoteEventQueue(), but that function has marked
      event as a nonnull parameter.  We were getting lucky (the
      event queue's first use of the event happened to be a call to
      virIsObjectClass(), which acts gracefully on NULL, so there
      was no way to crash); but this is a latent bug waiting to bite
      us due to the disregard for the nonnull attribute, as well as
      a waste of resources in the event queue.  Better is to just
      refuse to queue NULL.  The discard is silent, since the problem
      only happens on OOM, and since events are already best effort -
      if we fail to get an event, it's not like we have any memory
      left to report the issue, nor any idea of who would benefit
      from knowing we couldn't create or queue the event.
      
      * src/remote/remote_driver.c (remoteEventQueue): Ignore NULL event.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      f86e4630
    • E
      virt-login-shell: fix regressions in behavior · 3d007cb5
      Eric Blake 提交于
      Our fixes for CVE-2013-4400 were so effective at "fixing" bugs
      in virt-login-shell that we ended up fixing it into a useless
      do-nothing program.
      
      Commit 3e2f27e1 picked the name LIBVIRT_SETUID_RPC_CLIENT for
      the witness macro when we are doing secure compilation.  But
      commit 9cd6a57d checked whether the name IN_VIRT_LOGIN_SHELL,
      from an earlier version of the patch series, was defined; with
      the net result that virt-login-shell invariably detected that
      it was setuid and failed virInitialize.
      
      Commit b7fcc799 closed all fds larger than stderr, but in the
      wrong place.  Looking at the larger context, we mistakenly did
      the close in between obtaining the set of namespace fds, then
      actually using those fds to switch namespace, which means that
      virt-login-shell will ALWAYS fail.
      
      This is the minimal patch to fix the regressions, although
      further patches are also worth having to clean up poor
      semantics of the resulting program (for example, it is rude to
      not pass on the exit status of the wrapped program back to the
      invoking shell).
      
      * tools/virt-login-shell.c (main): Don't close fds until after
      namespace swap.
      * src/libvirt.c (virGlobalInit): Use correct macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      3d007cb5
    • E
      maint: improve VIR_ERR_INVALID_DOMAIN_SNAPSHOT usage · dd0e04d9
      Eric Blake 提交于
      The existing check of domain snapshots validated that they
      point to a domain, but did not validate that the domain
      points to a connection, even though any errors blindly assume
      the connection is valid.  On the other hand, as mentioned in
      commit 6e130ddc, any valid domain is already tied to a valid
      connection, and VIR_IS_SNAPSHOT vs. VIR_IS_DOMAIN_SNAPSHOT
      makes no real difference; it's best to just validate the chain
      of all three.  For consistency with previous patches, continue
      the trend of using a common macro.  For now, we don't need
      virCheckDomainSnapshotGoto().
      
      * src/datatypes.h (virCheckDomainSnapshotReturn): New macro.
      (VIR_IS_SNAPSHOT, VIR_IS_DOMAIN_SNAPSHOT):
      Drop unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibDomainSnapshotError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      dd0e04d9
    • E
      maint: improve VIR_ERR_INVALID_NWFILTER usage · 7d0a0ab7
      Eric Blake 提交于
      While all errors related to invalid nwfilters appeared to be
      consistent, we might as well continue the trend of using a
      common macro.  As in commit 6e130ddc, the difference between
      VIR_IS_NWFILTER and VIR_IS_CONNECTED_NWFILTER is moot, since
      reference counting means any valid nwfilter is also tied to
      a valid connection.  For now, we don't need virCheckNWFilterGoto().
      
      * src/datatypes.h (virCheckNWFilterReturn): New macro.
      (VIR_IS_NWFILTER, VIR_IS_CONNECTED_NWFILTER): Drop unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibNWFilterError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      7d0a0ab7
    • E
      maint: improve VIR_ERR_INVALID_STREAM usage · 101f176a
      Eric Blake 提交于
      For streams validation, we weren't consistent on whether to
      use VIR_FROM_NONE or VIR_FROM_STREAMS.  Furthermore, in many
      API, we want to ensure that a stream is tied to the same
      connection as the other object we are operating on; while
      other API failed to validate the stream at all.  And the
      difference between VIR_IS_STREAM and VIR_IS_CONNECTED_STREAM
      is moot; as in commit 6e130ddc, we know that reference
      counting means a valid stream will always be tied to a valid
      connection.  Similar to previous patches, use a common macro
      to make it nicer.
      
      * src/datatypes.h (virCheckStreamReturn, virCheckStreamGoto):
      New macros.
      (VIR_IS_STREAM, VIR_IS_CONNECTED_STREAM): Drop unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibStreamError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      101f176a
    • E
      maint: improve VIR_ERR_INVALID_SECRET usage · 916273eb
      Eric Blake 提交于
      While all errors related to invalid secrets appeared to be
      consistent, we might as well continue the trend of using a
      common macro.  Just as in commit 6e130ddc, the difference
      between VIR_IS_SECRET and VIR_IS_CONNECTED_SECRET is moot
      (due to reference counting, any valid secret must be tied to
      a valid domain).  For now, we don't need virCheckSecretGoto().
      
      * src/datatypes.h (virCheckSecretReturn): New macro.
      (VIR_IS_SECRET, VIR_IS_CONNECTED_SECRET): Drop unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibSecretError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      916273eb
    • E
      maint: improve VIR_ERR_INVALID_NODE_DEVICE usage · 9ec935d5
      Eric Blake 提交于
      While all errors related to invalid node device appeared to be
      consistent, we might as well continue the trend of using a
      common macro.  For now, we don't need virCheckNodeDeviceGoto().
      
      * src/datatypes.h (virCheckNodeDeviceReturn): New macro.
      (VIR_IS_NODE_DEVICE, VIR_IS_CONNECTED_NODE_DEVICE): Drop
      unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibNodeDeviceError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      9ec935d5
  4. 09 1月, 2014 11 次提交
    • M
      storage: fix crash when listing volumes or undefining a pool · 2a6395aa
      Martin Kletzander 提交于
      The commit cad3cf9a introduced a crash
      due to wrong order of parameters being passed to the function.  When
      deleting an element, the function decreased the iterator instead of
      count and if listing volumes after that (or undefining the pool, NULL
      was being dereferenced.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      2a6395aa
    • M
      qemuBuildNicDevStr: Set vectors= on Multiqueue · 4f588a1b
      Michal Privoznik 提交于
      Yet another advice appeared on the Multiqueue wiki page:
      
      http://www.linux-kvm.org/page/Multiqueue#Enable_MQ_feature
      
      We should add vectors=N onto the qemu command line, where
      N = 2 * (number of queues) + 1.
      4f588a1b
    • E
      maint: improve VIR_ERR_INVALID_STORAGE_VOL usage · 097c9b52
      Eric Blake 提交于
      For storage volume validation, we weren't consistent on
      whether to use VIR_FROM_NONE or VIR_FROM_STORAGE.  Similar
      to previous patches, use a common macro to make it nicer.
      Furthermore, just as in commit 6e130ddc, the difference
      between VIR_IS_STORAGE_VOL and VIR_IS_CONNECTED_STORAGE_VOL
      is moot (due to reference counting, any valid volume must
      be tied to a valid connection).
      
      virStorageVolCreateXMLFrom allows cross-connection cloning,
      where the error is reported against the connection of the
      destination pool.
      
      * src/datatypes.h (virCheckStorageVolReturn)
      (virCheckStorageVolGoto): New macros.
      (VIR_IS_STORAGE_VOL, VIR_IS_CONNECTED_STORAGE_VOL): Drop
      unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibStorageVolError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      097c9b52
    • G
      Add Documentation fields to systemd service files · 1b9f5aa7
      Guido Günther 提交于
      We point to the manpages where available and redirect to libvirt's
      homepage as a last resort.
      1b9f5aa7
    • S
      libxl: Fix devid init in libxlMakeNicList · e1459c1f
      Stefan Bader 提交于
      This basically reverts commit ba64b971
      "libxl: Allow libxl to set NIC devid". However assigning devid's
      before calling libxlMakeNic does not work as that is calling
      libxl_device_nic_init which sets it back to -1.
      Right now auto-assignment only works in the hotplug case. But even if
      that would be fixed at some point (if that is possible at all), this
      would add a weird dependency between Xen and libvirt versions.
      The change here should accept any auto-assignment that makes it into
      libxl_device_nic_init. My understanding is that a caller always is
      allowed to make the devid choice itself. And assuming libxlMakeNicList
      is only used on domain creation, a sequential numbering should be ok.
      Signed-off-by: NStefan Bader <stefan.bader@canonical.com>
      e1459c1f
    • E
      maint: improve VIR_ERR_INVALID_STORAGE_POOL usage · 8add79a9
      Eric Blake 提交于
      virStoragePoolBuild reported an invalid pool as if it were an
      invalid network.  Likewise, we weren't consistent on whether to
      use VIR_FROM_NONE or VIR_FROM_STORAGE.  Similar to previous
      patches, use a common macro to make it nicer.  Furthermore, just
      as in commit 6e130ddc, the difference between VIR_IS_STORAGE_POOL
      and VIR_IS_CONNECTED_STORAGE_POOL is moot (due to reference
      counting, any valid pool must be tied to a valid connection).
      For now, we don't need virCheckStoragePoolGoto().
      
      * src/datatypes.h (virCheckStoragePoolReturn): New macro.
      (VIR_IS_STORAGE_POOL, VIR_IS_CONNECTED_STORAGE_POOL): Drop
      unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibStoragePoolError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      8add79a9
    • R
      test driver: Add authentication to test driver. · e0933512
      Richard W.M. Jones 提交于
      There is no easy way to test authentication against libvirt.  This
      commit modifies the test driver to allow simple username/password
      authentication.
      
      You modify the test XML by adding:
      
       <node>
         ...
         <auth>
           <user password="123456">rich</user>
           <user>jane</user>
         </auth>
       </node>
      
      If there are any /node/auth/user elements, then authentication is
      required by the test driver (if none are present, then the test driver
      will work as before and not require authentication).
      
      In the example above, two phony users are added:
      
       rich  password: 123456
       jane  no password required
      
      The test driver will demand a username.  If the password attribute is
      present (or if the username entered is wrong), then the password is
      also asked for and checked:
      
       $ virsh -c test://$(pwd)/testnode.xml list
       Enter username for localhost: rich
       Enter rich's password for localhost: ***
        Id    Name                           State
       ----------------------------------------------------
        1     fv0                            running
        2     fc4                            running
      Signed-off-by: NRichard W.M. Jones <rjones@redhat.com>
      e0933512
    • E
      maint: improve VIR_ERR_INVALID_INTERFACE usage · 459532b4
      Eric Blake 提交于
      When checking for a valid interface, we weren't consistent on
      whether we reported as VIR_FROM_NONE or VIR_FROM_INTERFACE.
      Similar to previous patches, use a common macro to make it nicer.
      Furthermore, just as in commit 6e130ddc, the difference between
      VIR_IS_INTERFACE and VIR_IS_CONNECTED_INTERFACE is moot (due to
      reference counting, any valid interface must be tied to a valid
      connection).  For now, we don't need virCheckInterfaceGoto().
      
      * src/datatypes.h (virCheckInterfaceReturn): New macro.
      (VIR_IS_INTERFACE, VIR_IS_CONNECTED_INTERFACE): Drop unused
      macros.
      * src/libvirt.c: Use macro throughout.
      (virLibInterfaceError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      459532b4
    • E
      event: clean up client side RPC code · 6d8233fe
      Eric Blake 提交于
      Commit cfd62c1f was incomplete; I found more cases where error
      messages were being overwritten, and where the code between
      the three registration/deregistration APIs was not consistent.
      
      Since it is fairly easy to trigger an attempt to deregister an
      unregistered object through public API, I also changed the error
      message from VIR_ERR_INTERNAL_ERROR to VIR_ERR_INVALID_ARG.
      
      * src/conf/object_event.c (virObjectEventCallbackListEventID):
      Inline...
      (virObjectEventStateEventID): ...into lone caller, and report
      error on failure.
      (virObjectEventCallbackListAddID, virObjectEventStateCallbackID)
      (virObjectEventCallbackListRemoveID)
      (virObjectEventCallbackListMarkDeleteID): Tweak error category.
      * src/remote/remote_driver.c (remoteConnectDomainEventRegister):
      Don't leak registration on failure.
      (remoteConnectDomainEventDeregisterAny)
      (remoteConnectNetworkEventDeregisterAny): Don't overwrite error.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      6d8233fe
    • G
      Make sure AC_ARG_WITH is always executed · 41d6e49d
      Guido Günther 提交于
      41d6e49d
    • E
      maint: improve VIR_ERR_INVALID_NETWORK usage · e1761593
      Eric Blake 提交于
      When checking for a valid network, we weren't consistent on
      whether we reported an invalid network or a connection.  Similar
      to previous patches such as commit 6e130ddc, the difference
      between VIR_IS_NETWORK and VIR_IS_CONNECTED_NETWORK is moot (due
      to reference counting, any valid network must be tied to a valid
      connection).  Use a common macro to make the error reporting
      for invalid networks nicer.
      
      * src/datatypes.h (virCheckNetworkReturn, virCheckNetworkGoto): New
      macros.
      (VIR_IS_NETWORK, VIR_IS_CONNECTED_NETWORK): Drop unused macros.
      * src/libvirt.c: Use macro throughout.
      (virLibNetworkError): Drop unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      e1761593
  5. 08 1月, 2014 15 次提交
    • O
      util: Use new array management macros · 6f989485
      Osier Yang 提交于
      Like commit 94a26c7e from Eric Blake, the old fuzzy code should
      be replaced by the new array management macros now.
      
      And the type of scsi->count should be changed into "size_t", and
      thus virSCSIDeviceListCount should return size_t instead, similar
      for vir{PCI,USB}DeviceListCount.
      6f989485
    • C
      85600933
    • G
      LXC: create monitor socket under selinux context of domain · afba32b8
      Gao feng 提交于
      the unix socket /var/run/libvirt/lxc/domain.sock is not created
      under the selinux context which configured by <seclabel>.
      
      If we try to connect the domain.sock under the selinux context
      of domain in virtLXCProcessConnectMonitor,selinux will deny
      this connect operation.
      
      type=AVC msg=audit(1387953696.067:662): avc:  denied  { connectto } for  pid=21206 comm="libvirtd" path="/usr/local/var/run/libvirt/lxc/systemd.sock" scontext=unconfined_u:system_r:svirt_lxc_net_t:s0:c770,c848 tcontext=unconfined_u:system_r:unconfined_t:s0-s0:c0.c1023 tclass=unix_stream_socket
      
      fix this problem by creating socket under selinux context of domain.
      Signed-off-by: NGao feng <gaofeng@cn.fujitsu.com>
      afba32b8
    • M
      conf: trivial typo fix · 4a66ffad
      Martin Kletzander 提交于
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      4a66ffad
    • P
      virsh: Use inactive definition when removing disk from config · f9d06ebc
      Peter Krempa 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1049529
      
      The 'detach-disk' command in virsh used the active XML definition of a
      domain even when attempting to remove a disk from the config only. If
      the disk was only in the inactive definition the operation failed. Fix
      this by using the inactive XML in case that only the config is affected.
      f9d06ebc
    • P
      virsh: Don't use legacy API if --current is used on device hot(un)plug · 0bb64df1
      Peter Krempa 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=1049529
      
      The legacy virDomainAttachDevice and virDomainDetachDevice operate only
      on active domains. When a user specified --current flag with an inactive
      domain the old API was used and reported an error. Fix it by calling the
      new API if --current is specified explicitly.
      0bb64df1
    • M
      virConnect(Un)registerCloseCallback: Unlock @conn prior to error dispatch · 8ab6f1ad
      Michal Privoznik 提交于
      The function checks for @conn to be valid and locks its mutex. Then, it
      checks if callee is unregistering the same callback that he registered
      previously. If this fails an error is reported and  the control jumps to
      'error' label. Here, if @conn has some errors (and it certainly does -
      the one that's been just reported) the conn->mutex is locked again -
      without any previous unlock:
      
        Thread 1 (Thread 0x7fb500ef1800 (LWP 18982)):
        #0  __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
        #1  0x00007fb4fd99ce56 in _L_lock_918 () from /lib64/libpthread.so.0
        #2  0x00007fb4fd99ccaa in __GI___pthread_mutex_lock (mutex=0x7fb50153b670) at pthread_mutex_lock.c:64
        #3  0x00007fb5007e574d in virMutexLock (m=m@entry=0x7fb50153b670) at util/virthreadpthread.c:85
        #4  0x00007fb5007b198e in virDispatchError (conn=conn@entry=0x7fb50153b5e0) at util/virerror.c:594
        #5  0x00007fb5008a3735 in virConnectUnregisterCloseCallback (conn=0x7fb50153b5e0, cb=cb@entry=0x7fb500f588e0 <vshCatchDisconnect>) at libvirt.c:21025
        #6  0x00007fb500f5d690 in vshReconnect (ctl=ctl@entry=0x7fffff60e710) at virsh.c:328
        #7  0x00007fb500f5dc50 in vshCommandRun (ctl=ctl@entry=0x7fffff60e710, cmd=0x7fb50152ca80) at virsh.c:1755
        #8  0x00007fb500f5861b in main (argc=<optimized out>, argv=<optimized out>) at virsh.c:3393
      
      And since the conn's mutex is not recursive, the virDispatchError will
      never ever lock it successfully.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      8ab6f1ad
    • E
      maint: inline VIR_IS*_DOMAIN macro · c2aa14b4
      Eric Blake 提交于
      Cleanup after a previous patch, commit 6e130ddc.  In particular,
      note that xenDomainUsedCpus can only be reached from
      xenUnifiedDomainGetXMLDesc, which in turn is only reached from
      public API that already validated the domain.
      
      * src/xen/xen_driver.c (xenDomainUsedCpus): Drop redundant check.
      * src/datatypes.h (VIR_IS_DOMAIN, VIR_IS_CONNECTED_DOMAIN):
      Delete, and inline into all callers, since no other file uses it
      any more.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      c2aa14b4
    • G
      Allow to install apparmor profiles · 37705c12
      Guido Günther 提交于
      Make it easy to install the shipped examples. The aim is to have
      reasonably working templates so that distros only need to minimally
      patch these and can feed things upstream more easily.
      
      This was prompted by http://bugs.debian.org/725144
      37705c12
    • E
      maint: improve VIR_ERR_INVALID_DOMAIN usage · 6e130ddc
      Eric Blake 提交于
      In datatype.c, virGetDomainSnapshot could result in the message:
      
      error: invalid domain pointer in bad domain
      
      Furthermore, while there are a few functions in libvirt.c that
      only care about a virDomainPtr without regards to the connection
      (such as virDomainGetName), most functions also require a valid
      connection.  Yet several functions were blindly dereferencing
      the conn member without checking it for validity first (such as
      virDomainOpenConsole).  Rather than try and correct all usage
      of VIR_IS_DOMAIN vs. VIR_IS_CONNECTED_DOMAIN, it is easier to
      just blindly require that a valid domain object always has a
      valid connection object (which should be true anyways, since
      every domain object holds a reference to its connection, so the
      connection will not be closed until all domain objects have
      also been closed to release their reference).
      
      After this patch, all places that validate a domain consistently
      report:
      
      error: invalid domain pointer in someFunc
      
      * src/datatypes.h (virCheckDomainReturn, virCheckDomainGoto): New
      macros.
      * src/datatypes.c (virGetDomainSnapshot): Use new macro.
      (virLibConnError): Delete unused macro.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      6e130ddc
    • E
      event: make network events easier to use without casts · 36dd0bd8
      Eric Blake 提交于
      While comparing network and domain events, I noticed that the
      test driver had to do a cast in one place and not the other.
      For consistency, we should hide the necessary casting as low
      as possible in the stack, with everything else using saner
      types.
      
      * src/conf/network_event.h (virNetworkEventStateRegisterID): Alter
      type.
      * src/conf/network_event.c (virNetworkEventStateRegisterID): Hoist
      cast here.
      * src/test/test_driver.c (testConnectNetworkEventRegisterAny):
      Simplify callers.
      * src/remote/remote_driver.c
      (remoteConnectNetworkEventRegisterAny): Likewise.
      * src/network/bridge_driver.c
      (networkConnectNetworkEventRegisterAny): Likewise.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      36dd0bd8
    • E
      event: don't turn offline domain into global event · e9568360
      Eric Blake 提交于
      If a user registers for a domain event filtered to a particular
      domain, but the persistent domain is offline at the time, then
      the code silently failed to set up the filter.  As a result,
      the event fires for all domains, rather than being filtered.
      Network events were immune, since they always passed an id
      0 argument.
      
      The key to this patch is realizing that
      virObjectEventDispatchMatchCallback() only cared about uuid;
      so refusing to create a meta for a negative id is pointless,
      and in fact, malloc'ing meta at all was overkill; instead,
      just directly store a uuid and a flag of whether to filter.
      
      Note that virObjectEventPtr still needs all fields of meta,
      because this is how we reconstruct a virDomainPtr inside the
      dispatch handler before calling the end user's callback
      pointer with the correct object, even though only the uuid
      portion of meta is used in deciding whether a callback
      matches the given event.  So while uuid is optional for
      callbacks, it is mandatory for events.
      
      The change to testDomainCreateXMLMixed is merely on the setup
      scenario (as you can't register for a domain unless it is either
      running or persistent).  I actually first wrote that test for
      this patch, then rebased it to also cover a prior patch (commit
      4221d64f), but had to adjust it for that patch to use Create
      instead of Define for setting up the domain long enough to
      register the event in order to work around this bug.  But while
      the setup is changed, the main body of the test is still about
      whether creation events fire as expected.
      
      * src/conf/object_event_private.h (_virObjectEventCallback):
      Replace meta with uuid and flag.
      (virObjectEventCallbackListAddID): Update signature.
      * src/conf/object_event.h (virObjectEventStateRegisterID):
      Likewise.
      * src/conf/object_event_private.h (virObjectEventNew): Document
      use of name and uuid in events.
      * src/conf/object_event.c (virObjectEventCallbackListAddID): Drop
      arguments that don't affect filtering.
      (virObjectEventCallbackListRemoveID)
      (virObjectEventDispatchMatchCallback)
      (virObjectEventStateRegisterID): Update clients.
      * src/conf/domain_event.c (virDomainEventCallbackListAdd)
      (virDomainEventStateRegisterID): Likewise.
      * src/conf/network_event.c (virNetworkEventStateRegisterID):
      Likewise.
      * tests/objecteventtest.c (testDomainCreateXMLMixed): Enhance test.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      e9568360
    • E
      event: don't allow mix of old- and new-style registration · 0cd02bca
      Eric Blake 提交于
      Consider these two calls, in either order:
      
      id1 = virConnectDomainEventRegisterAny(conn, NULL,
         VIR_DOMAIN_EVENT_ID_LIFECYCLE,
         VIR_DOMAIN_EVENT_CALLBACK(callback), NULL, NULL);
      virConnectDomainEventRegister(conn, callback, NULL, NULL);
      
      Right now, the second call fails, because under the hood, the
      old-style function registration is tightly coupled to the
      new style lifecycle eventID, and the two calls both try
      to register the same global eventID callback representation.
      
      We've alreay documented that users should avoid old-style
      registration and deregistration, so anyone heeding the advice
      won't run into this situation.  But it would be even nicer if
      we pretend the two interfaces are completely separate, and
      disallow any cross-linking.  That is, a call to old-style
      deregister should never remove a new-style callback even if it
      is the same function pointer, and a call to new-style callback
      using only callbackIDs obtained legitimately should never
      remove an old-style callback (of course, since our callback
      IDs are sequential, and there is still coupling under the
      hood, you can easily guess the callbackID of an old style
      registration and use new-style deregistration to nuke it - but
      that starts to be blatantly bad coding on your part rather
      than a surprising result on what looks like reasonable
      stand-alone API).
      
      With this patch, you can now register a global lifecycle event
      handler twice, by using both old and new APIs; if such an event
      occurs, your callback will be entered twice.  But that is not a
      problem in practice, since it is already possible to use the
      new API to register both a global and per-domain event handler
      using the same function, which will likewise fire your callback
      twice for that domain.  Duplicates are still prevented when
      using the same API with same parameters twice (old-style twice,
      new-style global twice, or new-style per-domain with same domain
      twice), and things are still bounded (it is not possible to
      register a single function pointer more than N+2 times per event
      id, where N is the number of domains available on the connection).
      Besides, it has always been possible to register as many
      separate function pointers on the same event id as desired,
      through either old or new style API, where the bound there is
      the physical limitation of writing a program with enough
      distinct function pointers.
      
      Adding another event registration in the testsuite is sufficient
      to cover this, where the test fails without the rest of the patch.
      
      * src/conf/object_event.c (_virObjectEventCallback): Add field.
      (virObjectEventCallbackLookup): Add argument.
      (virObjectEventCallbackListAddID, virObjectEventStateCallbackID):
      Adjust callers.
      * tests/objecteventtest.c (testDomainCreateXMLMixed): Enhance test.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      0cd02bca
    • E
      event: properly filter count of remaining events · 995b2eba
      Eric Blake 提交于
      On the surface, this sequence of API calls should succeed:
      
      id1 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_LIFECYCLE,...);
      id2 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_RTC_CHANGE,...);
      virConnectDomainEventDeregisterAny(id1);
      id1 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_LIFECYCLE,...);
      
      And for test:///default, it does.  But for qemu:///system, it fails:
      libvirt: XML-RPC error : internal error: domain event 0 already registered
      
      Looking closer, the bug is caused by miscommunication between
      the object event engine and the client side of the remote driver.
      In our implementation, we set up a single server-side event per
      eventID, then the client side replicates that one event to all
      callbacks that have been registered client side.  To know when
      to turn the server side eventID on or off, the client side must
      track how many events for the same eventID have been registered.
      But while our code was filtering by eventID on event registration,
      it did not filter on event deregistration.  So the above API calls
      resulted in the deregister returning 1 instead of 0, so no RPC
      deregister was issued, and the final register detects on the
      server side that the server is already handling eventID 0.
      
      Unfortunately, since the problem is only observable on remote
      connections, it's not possible to enhance objecteventtest to
      expose the semantics using only public API entry points.
      
      * src/conf/object_event.c (virObjectEventCallbackListCount): New
      function.
      (virObjectEventCallbackListAddID)
      (virObjectEventCallbackListRemoveID)
      (virObjectEventCallbackListMarkDeleteID): Use it.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      995b2eba
    • L
      Fix bridge configuration when OUTPUT policy is DROP on the host · 538daf7f
      Lénaïc Huard 提交于
      When the host is configured with very restrictive firewall (default policy
      is DROP for all chains, including OUTPUT), the bridge driver for Linux
      adds netfilter entries to allow DHCP and DNS requests to go from the VM
      to the dnsmasq of the host.
      
      The issue that this commit fixes is the fact that a DROP policy on the OUTPUT
      chain blocks the DHCP replies from the host’s dnsmasq to the VM.
      As DHCP replies are sent in UDP, they are not caught by any --ctstate ESTABLISHED
      rule and so, need to be explicitly allowed.
      Signed-off-by: NLénaïc Huard <lenaic@lhuard.fr.eu.org>
      538daf7f