1. 03 4月, 2018 3 次提交
  2. 14 3月, 2018 1 次提交
    • D
      qemu: avoid denial of service reading from QEMU guest agent (CVE-2018-1064) · fbf31e1a
      Daniel P. Berrangé 提交于
      We read from the agent until seeing a \r\n pair to indicate a completed
      reply or event. To avoid memory denial-of-service though, we must have a
      size limit on amount of data we buffer. 10 MB is large enough that it
      ought to cope with normal agent replies, and small enough that we're not
      consuming unreasonable mem.
      
      This is identical to the flaw we had reading from the QEMU monitor
      as CVE-2018-5748, so rather embarrassing that we forgot to fix
      the agent code at the same time.
      Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
      fbf31e1a
  3. 12 2月, 2018 1 次提交
  4. 24 4月, 2017 1 次提交
  5. 13 12月, 2016 2 次提交
    • N
      qemu: agent: take monitor lock in qemuAgentNotifyEvent · cdd68193
      Nikolay Shirokovskiy 提交于
      qemuAgentNotifyEvent accesses monitor structure and is called on qemu
      reset/shutdown/suspend events under domain lock. Other monitor
      functions on the other hand take monitor lock and don't hold domain lock.
      Thus it is possible to have risky simultaneous access to the structure
      from 2 threads. Let's take monitor lock here to make access exclusive.
      cdd68193
    • N
      qemu: agent: fix uninitialized var case in qemuAgentGetFSInfo · 3ab9652a
      Nikolay Shirokovskiy 提交于
      In case of 0 filesystems *info is not set while according
      to virDomainGetFSInfo contract user should call free on it even
      in case of 0 filesystems. Thus we need to properly set
      it. NULL will be enough as free eats NULLs ok.
      3ab9652a
  6. 25 11月, 2016 1 次提交
    • M
      virstring: Unify string list function names · c2a5a4e7
      Michal Privoznik 提交于
      We have couple of functions that operate over NULL terminated
      lits of strings. However, our naming sucks:
      
      virStringJoin
      virStringFreeList
      virStringFreeListCount
      virStringArrayHasString
      virStringGetFirstWithPrefix
      
      We can do better:
      
      virStringListJoin
      virStringListFree
      virStringListFreeCount
      virStringListHasString
      virStringListGetFirstWithPrefix
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      c2a5a4e7
  7. 20 9月, 2016 5 次提交
    • N
      qemu: agent: give better error messages whe agent monitor is down · 6bff9c03
      Nikolay Shirokovskiy 提交于
      We can receive NULL as sync reply in two situations. First
      is garbage sync reply and this situation is handled by
      resending sync message. Second is different cases
      of rebooting guest, destroing domain etc and we can
      give more meaningful error message. Actually we have
      this error message in qemuAgentCommand already which checks
      for the same sitatuion. AFAIK case with mon->running
      is just to be safe on adding some future(?) cases of
      returning NULL reply.
      6bff9c03
    • N
      qemu: agent: reissue sync on garbage sync reply · 3f90a1aa
      Nikolay Shirokovskiy 提交于
      We can easily handle receiving garbage on sync. We don't
      have to make client deal with this situation. We just
      need to resend sync command but this time garbage is
      not be possible.
      3f90a1aa
    • N
      qemu: agent: skip outdated sync replies · 5e5019bf
      Nikolay Shirokovskiy 提交于
      When we wait for sync reply we can receive delayed
      reply to syncs or commands that were sent erlier. We can
      safely skip them until we receive sync reply with correct id.
      There is no much sense report this situation to client.
      Actually with a bit of "luck" if we involve client into
      this the play can go on forever: send sync 0, receive
      sync reply -1, send sync 1, receive reply 0 ...
      5e5019bf
    • N
      qemu: agent: ignore garbage while waiting for sync reply · 832d48d7
      Nikolay Shirokovskiy 提交于
      After sync is sent we can receive garbare and this is not error.
      Consider next regular case:
      
      1. libvirtd sends sync
      2. qga sends partial sync reply and die
      3. libvirtd sends sync
      4. qga sends sync reply
      5. libvirtd receives garbage
        (half of first reply and second reply together)
      
      We should handle this situation as it is recoverable.
      Next sync can succeed. Let's report reply is NULL,
      it will be converted to the VIR_ERR_AGENT_UNSYNCED
      which signals client to retry.
      832d48d7
    • N
      qemu: agent: ignore delayed reply when unsynced · 4fd25421
      Nikolay Shirokovskiy 提交于
      Errors in qemuAgentIOProcessLine stop agent IO processing just
      like any regular IO error, however some of current errors
      that this functions spawns are false positives. Consider
      next case for example:
      
      1. send sync (unsynced state)
      2. receive sync reply (sync established)
      3. command send, but timeout occured (unsynced state)
      4. receive command reply
      
      Last IO triggers error because current code ignores
      only delayed syncs when unsynced
      
      We should not treat any delayed reply as error in unsynced
      state. Until client and qga are not in sync delayed reply to any
      command is possible. msg == NULL is the exact criterion
      that we are not in sync.
      4fd25421
  8. 19 9月, 2016 1 次提交
  9. 07 9月, 2016 1 次提交
  10. 22 6月, 2016 1 次提交
    • P
      qemu: agent: Make setting of vcpus more robust · b1aa91e1
      Peter Krempa 提交于
      Documentation for the "guest-set-vcpus" command describes a proper
      algorithm how to set vcpus. This patch makes the following changes:
      
      - state of cpus that has not changed is not updated
      - if the command was partially successful the command is re-tried with
        the rest of the arguments to get a proper error message
      - code is more robust against malicious guest agent
      - fix testsuite to the new semantics
      b1aa91e1
  11. 16 5月, 2016 1 次提交
  12. 02 5月, 2016 1 次提交
    • M
      Change virDevicePCIAddress to virPCIDeviceAddress · c36b1f7b
      Martin Kletzander 提交于
      We had both and the only difference was that the latter also included
      information about multifunction setting.  The problem with that was that
      we couldn't use functions made for only one of the structs (e.g.
      parsing).  To consolidate those two structs, use the one in virpci.h,
      include that in domain_conf.h and add the multifunction member in it.
      Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
      c36b1f7b
  13. 15 4月, 2016 1 次提交
    • R
      Add functions for handling exponential backoff loops. · beaa447a
      Richard W.M. Jones 提交于
      In a few places in libvirt we busy-wait for events, for example qemu
      creating a monitor socket.  This is problematic because:
      
       - We need to choose a sufficiently small polling period so that
         libvirt doesn't add unnecessary delays.
      
       - We need to choose a sufficiently large polling period so that
         the effect of busy-waiting doesn't affect the system.
      
      The solution to this conflict is to use an exponential backoff.
      
      This patch adds two functions to hide the details, and modifies a few
      places where we currently busy-wait.
      Signed-off-by: NRichard W.M. Jones <rjones@redhat.com>
      beaa447a
  14. 11 4月, 2016 1 次提交
    • P
      qemu: agent: Fix incorrect and weird debug/warning log entries · a46aad79
      Peter Krempa 提交于
      Replace the nonsensical debug statement by adding the expected event
      code into the existing debug statement.
      
      Since the monitor code always notifies the agent on guest
      reboot/shutdown even if that was not initiated by the agent the warning
      emitted later is bogus and pollutes the logs in such cases. Delete it
      and keep just the original debug message where this info can be
      inferred.
      a46aad79
  15. 15 1月, 2016 1 次提交
    • Y
      qemu: Print better warning in qemuAgentNotifyEvent · c1e0df91
      Yaniv Kaul 提交于
      We have this function qemuAgentNotifyEvent() which is supposed to
      be called from thread pool responsible for processing qemu
      monitor events. The function then should wake up other thread
      that is waiting for a guest to shutdown or reboot. However, if we
      have received a different error a warning is printed out. This
      warning lacks info on which event is expected.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      c1e0df91
  16. 12 1月, 2016 1 次提交
    • M
      qemu: change qemuFindAgentConfig return type · d5762cc0
      Michal Privoznik 提交于
      While this is no functional change, whole channel definition is
      going to be needed very soon. Moreover, while touching this obey
      const correctness rule in qemuAgentOpen() - so far it was passed
      regular pointer to channel config even though the function is
      expected to not change pointee at all. Pass const pointer
      instead.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      d5762cc0
  17. 09 10月, 2015 1 次提交
    • M
      virJSONValueArraySize: return ssize_t · 4f77c48c
      Michal Privoznik 提交于
      The internal representation of a JSON array counts the items in
      size_t. However, for some reason, when asking for the count it's
      reported as int. Firstly, we need the function to return a signed
      type as it's returning -1 on an error. But, not every system has
      integer the same size as size_t. Therefore, lets return ssize_t.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      4f77c48c
  18. 01 7月, 2015 1 次提交
  19. 21 5月, 2015 2 次提交
  20. 07 5月, 2015 1 次提交
    • M
      processSerialChangedEvent: Close agent monitor early · 2af51483
      Michal Privoznik 提交于
      https://bugzilla.redhat.com/show_bug.cgi?id=890648
      
      So, imagine you've issued an API that involves guest agent. For
      instance, you want to query guest's IP addresses. So the API acquires
      QUERY_JOB, locks the guest agent and issues the agent command.
      However, for some reason, guest agent replies to initial ping
      correctly, but then crashes tragically while executing real command
      (in this case guest-network-get-interfaces). Since initial ping went
      well, libvirt thinks guest agent is accessible and awaits reply to the
      real command. But it will never come. What will is a monitor event.
      Our handler (processSerialChangedEvent) will try to acquire
      MODIFY_JOB, which will fail obviously because the other thread that's
      executing the API already holds a job. So the event handler exits
      early, and the QUERY_JOB is never released nor ended.
      
      The way how to solve this is to put flag somewhere in the monitor
      internals. The flag is called @running and agent commands are issued
      iff the flag is set. The flag itself is set when we connect to the
      agent socket. And unset whenever we see DISCONNECT event from the
      agent. Moreover, we must wake up all the threads waiting for the
      agent. This is done by signalizing the condition they're waiting on.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      2af51483
  21. 26 4月, 2015 1 次提交
  22. 02 4月, 2015 1 次提交
  23. 18 3月, 2015 1 次提交
  24. 17 3月, 2015 1 次提交
    • N
      domifaddr: Implement the API for qemu · 0977b8aa
      Nehal J Wani 提交于
      By querying the qemu guest agent with the QMP command
      "guest-network-get-interfaces" and converting the received JSON
      output to structured objects.
      
      Although "ifconfig" is deprecated, IP aliases created by "ifconfig"
      are supported by this API. The legacy syntax of an IP alias is:
      "<ifname>:<alias-name>". Since we want all aliases to be clubbed
      under parent interface, simply stripping ":<alias-name>" suffices.
      Note that IP aliases formed by "ip" aren't visible to "ifconfig",
      and aliases created by "ip" do not have any specific name. But
      we are lucky, as qemu guest agent detects aliases created by both.
      
      src/qemu/qemu_agent.h:
        * Define qemuAgentGetInterfaces
      
      src/qemu/qemu_agent.c:
        * Implement qemuAgentGetInterface
      
      src/qemu/qemu_driver.c:
        * New function qemuGetDHCPInterfaces
        * New function qemuDomainInterfaceAddresses
      
      src/remote_protocol-sructs:
        * Define new structs
      
      tests/qemuagenttest.c:
        * Add new test: testQemuAgentGetInterfaces
          Test cases for IP aliases, 0 or multiple ipv4/ipv6 address(es)
      Signed-off-by: NNehal J Wani <nehaljw.kkd1@gmail.com>
      0977b8aa
  25. 24 11月, 2014 1 次提交
  26. 15 11月, 2014 1 次提交
  27. 29 10月, 2014 1 次提交
    • M
      qemu_agent: Produce more readable error messages · b7fe5a65
      Michal Privoznik 提交于
      Not every error message from qemu-ga has to have the 'class' field
      filled out. For instance, I've seen this error message lately:
      
        qemuAgentCheckError:1047 : unable to execute QEMU agent command \
        {"execute":"guest-set-time"}: \
        {"error":{"desc":"Invalid parameter type, expected: integer"}}
      
      However, this got translated into rather generic error message:
      
        internal error: unable to execute QEMU agent command
        'guest-set-time': unknown QEMU command error
      
      So we've dropped better error message in favor of a generic one.
      This is due to our code which expects 'class' which is not
      present here.
      Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
      b7fe5a65
  28. 28 8月, 2014 1 次提交
    • J
      qemu_agent: Resolve Coverity RESOURCE_LEAK · 6f8a4f6d
      John Ferlan 提交于
      Coverity found that on error paths, the 'arg' value wasn't be cleaned
      up. Followed the example in qemuAgentSetVCPUs() where upon successful call
      to qemuAgentCommand() the 'cpus' is set to NULL; otherwise, when cleanup
      occurs the free the memory for 'arg'
      6f8a4f6d
  29. 11 8月, 2014 1 次提交
  30. 20 5月, 2014 1 次提交
    • P
      avoid 'sync' as variable name · d5c86278
      Pavel Hrdina 提交于
      Old gcc complains about shadowing 'sync' variable:
      
      ../../src/qemu/qemu_agent.c: In function 'qemuAgentSetTime':
      ../../src/qemu/qemu_agent.c:1737: warning: declaration of 'sync'
        shadows a global declaration [-Wshadow]
      /usr/include/unistd.h:464: warning: shadowed declaration is here
        [-Wshadow]
      Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
      d5c86278
  31. 15 5月, 2014 1 次提交
  32. 13 5月, 2014 1 次提交