1. 21 Jul, 2014 3 commits
    • Nicholas Bellinger's avatar
      target: Explicitly clear ramdisk_mcp backend pages · ff5d076f
      Nicholas Bellinger authored
      [Note that a different patch to address the same issue went in during
      v3.15-rc1 (commit 4442dc8a), but includes a bunch of other changes that
      don't strictly apply to fixing the bug.]
      
      This patch changes rd_allocate_sgl_table() to explicitly clear
      ramdisk_mcp backend memory pages by passing __GFP_ZERO into
      alloc_pages().
      
      This addresses a potential security issue where reading from a
      ramdisk_mcp could return sensitive information, and follows what
      >= v3.15 does to explicitly clear ramdisk_mcp memory at backend
      device initialization time.
      Reported-by: default avatarJorge Daniel Sequeira Matias <jdsm@tecnico.ulisboa.pt>
      Cc: Jorge Daniel Sequeira Matias <jdsm@tecnico.ulisboa.pt>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      Reference: CVE-2014-4027
      Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
      ff5d076f
    • Paolo Bonzini's avatar
      KVM: ioapic: fix assignment of ioapic->rtc_status.pending_eoi (CVE-2014-0155) · bad3f63f
      Paolo Bonzini authored
      commit 5678de3f upstream.
      
      QE reported that they got the BUG_ON in ioapic_service to trigger.
      I cannot reproduce it, but there are two reasons why this could happen.
      
      The less likely but also easiest one, is when kvm_irq_delivery_to_apic
      does not deliver to any APIC and returns -1.
      
      Because irqe.shorthand == 0, the kvm_for_each_vcpu loop in that
      function is never reached.  However, you can target the similar loop in
      kvm_irq_delivery_to_apic_fast; just program a zero logical destination
      address into the IOAPIC, or an out-of-range physical destination address.
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
      bad3f63f
    • Tony Camuso's avatar
      ACPI / PAD: call schedule() when need_resched() is true · a0c72a16
      Tony Camuso authored
      commit 5b59c69e upstream.
      
      The purpose of the acpi_pad driver is to implement the "processor power
      aggregator" device as described in the ACPI 4.0 spec section 8.5. It
      takes requests from the BIOS (via ACPI) to put a specified number of
      CPUs into idle, in order to save power, until further notice.
      
      It does this by creating high-priority threads that try to keep the CPUs
      in a high C-state (using the monitor/mwait CPU instructions). The
      mwait() call is in a loop that checks periodically if the thread should
      end and a few other things.
      
      It was discovered through testing that the power_saving threads were
      causing the system to consume more power than the system was consuming
      before the threads were created. A counter in the main loop of
      power_saving_thread() revealed that it was spinning. The mwait()
      instruction was not keeping the CPU in a high C state very much if at
      all.
      
      Here is a simplification of the loop in function power_saving_thread() in
      drivers/acpi/acpi_pad.c
      
          while (!kthread_should_stop()) {
               :
              try_to_freeze()
               :
              while (!need_resched()) {
                   :
                  if (!need_resched())
                      __mwait(power_saving_mwait_eax, 1);
                   :
                  if (jiffies > expire_time) {
                      do_sleep = 1;
                      break;
                  }
              }
          }
      
      If need_resched() returns true, then mwait() is not called. It was
      returning true because of things like timer interrupts, as in the
      following sequence.
      
      hrtimer_interrupt->__run_hrtimer->tick_sched_timer-> update_process_times->
      rcu_check_callbacks->rcu_pending->__rcu_pending->set_need_resched
      
      Kernels 3.5.0-rc2+ do not exhibit this problem, because a patch to
      try_to_freeze() in include/linux/freezer.h introduces a call to
      might_sleep(), which ultimately calls schedule() to clear the reschedule
      flag and allows the the loop to execute the call to mwait().
      
      However, the changes to try_to_freeze are unrelated to acpi_pad, and it
      does not seem like a good idea to rely on an unrelated patch in a
      function that could later be changed and reintroduce this bug.
      
      Therefore, it seems better to make an explicit call to schedule() in the
      outer loop when the need_resched flag is set.
      Reported-and-tested-by: default avatarStuart Hayes <stuart_hayes@dell.com>
      Signed-off-by: default avatarTony Camuso <tcamuso@redhat.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Leann Ogasawara <leann.ogasawara@canonical.com>
      Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
      a0c72a16
  2. 18 Jul, 2014 1 commit
  3. 16 Jul, 2014 36 commits