1. 30 1月, 2013 29 次提交
  2. 28 1月, 2013 2 次提交
  3. 27 1月, 2013 8 次提交
  4. 26 1月, 2013 1 次提交
    • M
      vmware_vga: fix out of bounds and invalid rects updating · 8cb6bfb5
      Michael Tokarev 提交于
      This is a follow up for several attempts to fix this issue.
      
      Previous incarnations:
      
      1. http://thread.gmane.org/gmane.linux.ubuntu.bugs.general/3156089
      https://bugs.launchpad.net/bugs/918791
      "qemu-kvm dies when using vmvga driver and unity in the guest" bug.
      Fix by Serge Hallyn:
       https://launchpadlibrarian.net/94916786/qemu-vmware.debdiff
      This fix is incomplete, since it does not check width and height
      for being negative.  Serge weren't sure if that's the right place
      to fix it, maybe the fix should be up the stack somewhere.
      
      2. http://thread.gmane.org/gmane.comp.emulators.qemu/166064
      by Marek Vasut: "vmware_vga: Redraw only visible area"
      
      This one adds the (incomplete) check to vmsvga_update_rect_delayed(),
      the routine just queues the rect updating but does no interesting
      stuff.  It is also incomplete in the same way as patch by Serge,
      but also does not touch width&height at all after adjusting x&y,
      which is wrong.
      
      As far as I can see, when processing guest requests, the device
      places them into a queue (vmsvga_update_rect_delayed()) and
      processes this queue in different place/time, namely, in
      vmsvga_update_rect().  Sometimes, vmsvga_update_rect() is
      called directly, without placing the request to the gueue.
      This is the place this patch changes, which is the last
      (deepest) in the stack.  I'm not sure if this is the right
      place still, since it is possible we have some queue optimization
      (or may have in the future) which will be upset by negative/wrong
      values here, so maybe we should check for validity of input
      right when receiving request from the guest (and maybe even
      use unsigned types there).  But I don't know the protocol
      and implementation enough to have a definitive answer.
      
      But since vmsvga_update_rect() has other sanity checks already,
      I'm adding the missing ones there as well.
      
      Cc'ing BALATON Zoltan and Andrzej Zaborowski who shows in `git blame'
      output and may know something in this area.
      
      If this patch is accepted, it should be applied to all active
      stable branches (at least since 1.1, maybe even before), with
      minor context change (ds_get_*(s->vga.ds) => s->*).  I'm not
      Cc'ing -stable yet, will do it explicitly once the patch is
      accepted.
      
      BTW, these checks use fprintf(stderr) -- it should be converted
      to something more appropriate, since stderr will most likely
      disappear somewhere.
      
      Cc: Marek Vasut <marex@denx.de>
      CC: Serge Hallyn <serge.hallyn@ubuntu.com>
      Cc: BALATON Zoltan <balaton@eik.bme.hu>
      Cc: Andrzej Zaborowski <balrogg@gmail.com>
      Signed-off-by: NMichael Tokarev <mjt@tls.msk.ru>
      Reviewed-by: NMarek Vasut <marex@denx.de>
      Signed-off-by: NSerge Hallyn <serge.hallyn@ubuntu.com>
      Signed-off-by: NBlue Swirl <blauwirbel@gmail.com>
      8cb6bfb5