1. 30 6月, 2016 1 次提交
  2. 13 12月, 2015 1 次提交
    • E
      CVE-2015-5313: storage: don't allow '/' in filesystem volume names · 08acad56
      Eric Blake 提交于
      The libvirt file system storage driver determines what file to
      act on by concatenating the pool location with the volume name.
      If a user is able to pick names like "../../../etc/passwd", then
      they can escape the bounds of the pool.  For that matter,
      virStoragePoolListVolumes() doesn't descend into subdirectories,
      so a user really shouldn't use a name with a slash.
      
      Normally, only privileged users can coerce libvirt into creating
      or opening existing files using the virStorageVol APIs; and such
      users already have full privilege to create any domain XML (so it
      is not an escalation of privilege).  But in the case of
      fine-grained ACLs, it is feasible that a user can be granted
      storage_vol:create but not domain:write, and it violates
      assumptions if such a user can abuse libvirt to access files
      outside of the storage pool.
      
      Therefore, prevent all use of volume names that contain "/",
      whether or not such a name is actually attempting to escape the
      pool.
      
      This changes things from:
      
      $ virsh vol-create-as default ../../../../../../etc/haha --capacity 128
      Vol ../../../../../../etc/haha created
      $ rm /etc/haha
      
      to:
      
      $ virsh vol-create-as default ../../../../../../etc/haha --capacity 128
      error: Failed to create vol ../../../../../../etc/haha
      error: Requested operation is not valid: volume name '../../../../../../etc/haha' cannot contain '/'
      Signed-off-by: NEric Blake <eblake@redhat.com>
      (cherry picked from commit 034e47c3)
      08acad56
  3. 03 9月, 2015 4 次提交
    • M
      remoteClientCloseFunc: Don't mangle connection object refcount · 4268b1f1
      Michal Privoznik 提交于
      Well, in 8ad126e6 we tried to fix a memory corruption problem.
      However, the fix was not as good as it could be. I mean, the
      commit has one line more than it should. I've noticed this output
      just recently:
      
        # ./run valgrind --leak-check=full --show-reachable=yes ./tools/virsh domblklist gentoo
        ==17019== Memcheck, a memory error detector
        ==17019== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
        ==17019== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
        ==17019== Command: /home/zippy/work/libvirt/libvirt.git/tools/.libs/virsh domblklist gentoo
        ==17019==
        Target     Source
        ------------------------------------------------
        fda        /var/lib/libvirt/images/fd.img
        vda        /var/lib/libvirt/images/gentoo.qcow2
        hdc        /home/zippy/tmp/install-amd64-minimal-20150402.iso
      
        ==17019== Thread 2:
        ==17019== Invalid read of size 4
        ==17019==    at 0x4EFF5B4: virObjectUnref (virobject.c:258)
        ==17019==    by 0x5038CFF: remoteClientCloseFunc (remote_driver.c:552)
        ==17019==    by 0x5069D57: virNetClientCloseLocked (virnetclient.c:685)
        ==17019==    by 0x506C848: virNetClientIncomingEvent (virnetclient.c:1852)
        ==17019==    by 0x5082136: virNetSocketEventHandle (virnetsocket.c:1913)
        ==17019==    by 0x4ECD64E: virEventPollDispatchHandles (vireventpoll.c:509)
        ==17019==    by 0x4ECDE02: virEventPollRunOnce (vireventpoll.c:658)
        ==17019==    by 0x4ECBF00: virEventRunDefaultImpl (virevent.c:308)
        ==17019==    by 0x130386: vshEventLoop (vsh.c:1864)
        ==17019==    by 0x4F1EB07: virThreadHelper (virthread.c:206)
        ==17019==    by 0xA8462D3: start_thread (in /lib64/libpthread-2.20.so)
        ==17019==    by 0xAB441FC: clone (in /lib64/libc-2.20.so)
        ==17019==  Address 0x139023f4 is 4 bytes inside a block of size 240 free'd
        ==17019==    at 0x4C2B1F0: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
        ==17019==    by 0x4EA8949: virFree (viralloc.c:582)
        ==17019==    by 0x4EFF6D0: virObjectUnref (virobject.c:273)
        ==17019==    by 0x4FE74D6: virConnectClose (libvirt.c:1390)
        ==17019==    by 0x13342A: virshDeinit (virsh.c:406)
        ==17019==    by 0x134A37: main (virsh.c:950)
      
      The problem is, when registering remoteClientCloseFunc(), it's
      conn->closeCallback which is ref'd. But in the function itself
      it's conn->closeCallback->conn what is unref'd. This is causing
      imbalance in reference counting. Moreover, there's no need for
      the remote driver to increase/decrease conn refcount since it's
      not used anywhere. It's just merely passed to client registered
      callback. And for that purpose it's correctly ref'd in
      virConnectRegisterCloseCallback() and then unref'd in
      virConnectUnregisterCloseCallback().
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      (cherry picked from commit e6893007)
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      4268b1f1
    • J
      storage: Correct the 'mode' check · d0559890
      John Ferlan 提交于
      Commit id '7c2d65dd' changed the default value of mode to be -1 if not
      supplied in the XML, which should cause creation of the volume using the
      default mode of VIR_STORAGE_DEFAULT_VOL_PERM_MODE; however, the check
      made was whether mode was '0' or not to use default or provided value.
      
      This patch fixes the issue to check if the 'mode' was provided in the XML
      and use that value.
      
      (cherry picked from commit 691dd388)
      d0559890
    • J
      storage: Handle failure from refreshVol · 98242f94
      John Ferlan 提交于
      Commit id '155ca616' added the 'refreshVol' API. In an NFS root-squash
      environment it was possible that if the just created volume from XML wasn't
      properly created with the right uid/gid and/or mode, then the followup
      refreshVol will fail to open the volume in order to get the allocation/
      capacity values. This would leave the volume still on the server and
      cause a libvirtd crash because 'voldef' would be in the pool list, but
      the cleanup code would free it.
      
      (cherry picked from commit db9277a3)
      98242f94
    • J
      virfile: Introduce virFileUnlink · a3ee6885
      John Ferlan 提交于
      In an NFS root-squashed environment the 'vol-delete' command will fail to
      'unlink' the target volume since it was created under a different uid:gid.
      
      This code continues the concepts introduced in virFileOpenForked and
      virDirCreate[NoFork] with respect to running the unlink command under
      the uid/gid of the child. Unlike the other two, don't retry on EACCES
      (that's why we're here doing this now).
      
      (cherry picked from commit 35847860)
      a3ee6885
  4. 29 8月, 2015 1 次提交
  5. 17 7月, 2015 1 次提交
  6. 10 7月, 2015 2 次提交
  7. 02 7月, 2015 5 次提交
  8. 01 7月, 2015 14 次提交
    • M
      lxc: Don't pass a local variable address randomly · 302146b1
      Michal Privoznik 提交于
      So, recently I was testing the LXC driver. You know, startup some
      domains. But to my surprise, I was not able to start a single one:
      
        virsh # start --console test
        error: Reconnected to the hypervisor
        error: Failed to start domain test
        error: internal error: guest failed to start: unexpected exit status 125
      
      So I've start digging. It turns out, that in virExec(), when I printed
      out the @cmd, I got strange values: *(cmd->outfdptr) was certainly not
      valid FD number: it has random value of several millions. This
      obviously made prepareStdFd(childout, STDOUT_FILENO) fail (line 611).
      But outfdptr is set in virCommandSetOutputFD(). The only place within
      LXC driver where the function is called is in
      virLXCProcessBuildControllerCmd(). If you take a closer look at the
      function it looks like this:
      
      static virCommandPtr
      virLXCProcessBuildControllerCmd(virLXCDriverPtr driver,
                                      ..
                                      int logfd,
                                      const char *pidfile)
      {
          ...
          virCommandSetOutputFD(cmd, &logfd);
          virCommandSetErrorFD(cmd, &logfd);
          ...
      }
      
      Yes, you guessed it. @logfd is passed into the function by value.
      However, in the function we try to get its address (an address of a
      local variable) which is no longer valid once function is finished and
      stack is cleaned. Therefore when cmd->outfdptr is evaluated at any
      point after this function, we may get a random number, depending on
      what's currently on the stack. Of course, this may work sometimes too
      - it depends on the compiler how it arranges the code, when the stack
      is wiped out.
      
      In order to fix this, lets pass a pointer to @logfd instead of
      figuring out (wrong) its value in a function.
      
      The bug was introduced in e1de5521.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      302146b1
    • J
      qemu: Resolve Coverity DEADCODE · ebd62eba
      John Ferlan 提交于
      Commit id 'f967e7a6' didn't place the closing parentheses quite right
      causing DEADCODE errors since the rc setting/comparison was wrong.
      ebd62eba
    • P
      conf: qemu: Taint VMs using custom device tree blob · 4b48ba4a
      Peter Krempa 提交于
      Using a custom device tree image may cause unexpected behavior in
      architectures that use this approach to detect platform devices. Since
      usually the device tree is generated by qemu and thus it's not normally
      used let's taint VMs using it to make it obvious as a possible source of
      problems.
      4b48ba4a
    • P
      qemu: Audit memory size with memory hotplug operations · 91081979
      Peter Krempa 提交于
      The memory device hot(un)plug was missing calls to the auditing code.
      
      Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1226234
      91081979
    • P
      conf: audit: Audit physical memory size rather than balloon request · 1a136774
      Peter Krempa 提交于
      Since the balloon driver does not guarantee that it returns memory to
      the host, using the value in the audit message is not a good idea.
      
      This patch removes auditing from updating the balloon size and reports
      the total physical size at startup.
      1a136774
    • J
      qemu: Avoid using ".(null)" in UNIX socket path · ffbafd4e
      Jiri Denemark 提交于
      The code which generates paths for UNIX socket blindly used target name
      without checking if it was set. Thus for the following device XML
      
          <channel type='unix'>
            <source mode='bind'/>
            <target type='virtio'/>
          </channel>
      
      we would generate "/var/lib/libvirt/qemu/channel/target/NAME.(null)"
      path which works but is not really correct. Let's not use the
      ".target_name" suffix at all if target name is not set.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1226854Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
      ffbafd4e
    • P
      qemu: agent: Don't automatically disable CPU0 via guest agent · 18c9d157
      Peter Krempa 提交于
      While CPU0 was made unpluggable in Linux a while ago it's not desirable
      to unplug it since some parts of the kernel (suspend-to-ram) still
      depend on it.
      
      This patch fixes the vCPU selection code in libvirt so that it will not
      be disabled.
      18c9d157
    • L
      91c9e4d9
    • J
      qemu: properly free addresses on non-serial chardev unplug · 224456fc
      Ján Tomko 提交于
      The target type comparison in qemuDomainDetachChrDevice
      used the VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE enum, so virtio-serial
      addresses were not freed properly for channel devices.
      
      Call qemuDomainReleaseDeviceAddress uncoditionally and decide
      based on the address type instead of the target/device types.
      224456fc
    • L
      qemu: fix address allocation on chardev attach · f967e7a6
      Luyao Huang 提交于
      Also check the device type when deciding what type the address should
      be. Commit 9807c471 (aiming to fix another error in address allocation)
      only checked the target type, but its value is different for different
      device types. This resulted in an error when trying to attach
      a channel with target type 'virtio':
      
      error: Failed to attach device from channel-file.xml
      error: internal error: virtio serial device has invalid address type
      
      Make the logic for releasing the address dependent only on
      * the address type
      * whether it was allocated earlier
      to avoid copying the device and target type checks.
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1230039Signed-off-by: NLuyao Huang <lhuang@redhat.com>
      Signed-off-by: NJán Tomko <jtomko@redhat.com>
      f967e7a6
    • J
      libxl: Set def->vcpus after successfully modifying live vcpu count · 04597f8f
      Jim Fehlig 提交于
      def->vcpus was never updated after successfully changing the live
      vcpu count of a domain. Subsequent queries for vcpu info would
      return incorrect results.  E.g.:
      
      virsh vcpucount test
      maximum      config         4
      maximum      live           4
      current      config         4
      current      live           4
      
      virsh setvcpus test 2
      
      virsh vcpucount test
      maximum      config         4
      maximum      live           4
      current      config         4
      current      live           4
      
      After patch, live current config is reported correctly:
      
      virsh vcpucount test
      maximum      config         4
      maximum      live           4
      current      config         4
      current      live           2
      
      While fixing this, noticed that the live config was not saved
      to cfg->stateDir via virDomainSaveStatus. Save the live config
      and change error handling of virDomainSave{Config,Status} to
      log a message via VIR_WARN, instead of failing the entire
      DomainSetVcpusFlags operation.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      04597f8f
    • J
      libxl: honor domainGetXMLDesc() --inactive flag · 33be48d7
      Jim Fehlig 提交于
      The libxl driver always uses virDomainObj->def when formatting
      the domain XML description.  Use virDomainObj->newDef when
      --inactive flag is set.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      33be48d7
    • J
      libxl: don't remove persistent domain on start failure · 4b53d0d4
      Jim Fehlig 提交于
      libxlDomainCreateXML() would remove a persistent domain if
      libxlDomainStart() failed.  Check if domain is persistent
      before removing.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      4b53d0d4
    • J
      libxl: don't overwrite domain state from statedir config · 29b154e2
      Jim Fehlig 提交于
      When restarting libvirtd and reconnecting to running domains,
      libxlReconnectDomain() would unconditionally set the domain state
      to VIR_DOMAIN_RUNNING, overwriting the state maintained in
      $statedir/<domname>.xml.  A domain in a paused state would have
      the state changed to running, even though it was actually in a
      paused state.
      Signed-off-by: NJim Fehlig <jfehlig@suse.com>
      29b154e2
  9. 30 6月, 2015 11 次提交