* Re: [Qemu-devel] [PATCH v2] vmware_vga: fix out of bounds and invalid rects updating [not found] ` <CAAu8pHv97oQqf9JVXdtg-OL-do8n5L3mivYfLYXDsDgq_r3VKQ@mail.gmail.com> @ 2013-02-01 12:57 ` Michael Tokarev 2013-02-01 13:01 ` Marek Vasut 0 siblings, 1 reply; 2+ messages in thread From: Michael Tokarev @ 2013-02-01 12:57 UTC (permalink / raw) To: Blue Swirl; +Cc: Marek Vasut, aliguori, Serge Hallyn, qemu-devel 26.01.2013 19:09, Blue Swirl wrote: > Thanks, applied. Now when I've comments from BALATON Zoltan, I asked Serge to try out the current qemu in the environment where this buh was easy to trigger (ubuntu guest with unity desktop) - and he says he can't reproduce the issue anymore (this does not mean it does not exist ofcourse). So maybe this patch isn't really needed? I dunno. Thanks, /mjt > On Fri, Jan 25, 2013 at 5:23 PM, Michael Tokarev <mjt@tls.msk.ru> wrote: >> 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: Michael Tokarev <mjt@tls.msk.ru> >> Reviewed-by: Marek Vasut <marex@denx.de> >> Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com> >> --- >> hw/vmware_vga.c | 18 ++++++++++++++++++ >> 1 file changed, 18 insertions(+) >> >> diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c >> index 62771bb..cd15ee4 100644 >> --- a/hw/vmware_vga.c >> +++ b/hw/vmware_vga.c >> @@ -296,6 +296,15 @@ static inline void vmsvga_update_rect(struct vmsvga_state_s *s, >> uint8_t *src; >> uint8_t *dst; >> >> + if (x < 0) { >> + fprintf(stderr, "%s: update x was < 0 (%d)\n", __func__, x); >> + w += x; >> + x = 0; >> + } >> + if (w < 0) { >> + fprintf(stderr, "%s: update w was < 0 (%d)\n", __func__, w); >> + w = 0; >> + } >> if (x + w > ds_get_width(s->vga.ds)) { >> fprintf(stderr, "%s: update width too large x: %d, w: %d\n", >> __func__, x, w); >> @@ -303,6 +312,15 @@ static inline void vmsvga_update_rect(struct vmsvga_state_s *s, >> w = ds_get_width(s->vga.ds) - x; >> } >> >> + if (y < 0) { >> + fprintf(stderr, "%s: update y was < 0 (%d)\n", __func__, y); >> + h += y; >> + y = 0; >> + } >> + if (h < 0) { >> + fprintf(stderr, "%s: update h was < 0 (%d)\n", __func__, h); >> + h = 0; >> + } >> if (y + h > ds_get_height(s->vga.ds)) { >> fprintf(stderr, "%s: update height too large y: %d, h: %d\n", >> __func__, y, h); >> -- >> 1.7.10.4 >> >> ^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Qemu-devel] [PATCH v2] vmware_vga: fix out of bounds and invalid rects updating 2013-02-01 12:57 ` [Qemu-devel] [PATCH v2] vmware_vga: fix out of bounds and invalid rects updating Michael Tokarev @ 2013-02-01 13:01 ` Marek Vasut 0 siblings, 0 replies; 2+ messages in thread From: Marek Vasut @ 2013-02-01 13:01 UTC (permalink / raw) To: Michael Tokarev; +Cc: Blue Swirl, aliguori, Serge Hallyn, qemu-devel Dear Michael Tokarev, > 26.01.2013 19:09, Blue Swirl wrote: > > Thanks, applied. > > Now when I've comments from BALATON Zoltan, I asked Serge to try > out the current qemu in the environment where this buh was easy > to trigger (ubuntu guest with unity desktop) - and he says he > can't reproduce the issue anymore (this does not mean it does not > exist ofcourse). > > So maybe this patch isn't really needed? I dunno. Or maybe the vmware driver was fixed on the host side. This doesn't mean there aren't buggy installations in the wild. > Thanks, > > /mjt > > > On Fri, Jan 25, 2013 at 5:23 PM, Michael Tokarev <mjt@tls.msk.ru> wrote: > >> 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: Michael Tokarev <mjt@tls.msk.ru> > >> Reviewed-by: Marek Vasut <marex@denx.de> > >> Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com> > >> --- > >> > >> hw/vmware_vga.c | 18 ++++++++++++++++++ > >> 1 file changed, 18 insertions(+) > >> > >> diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c > >> index 62771bb..cd15ee4 100644 > >> --- a/hw/vmware_vga.c > >> +++ b/hw/vmware_vga.c > >> @@ -296,6 +296,15 @@ static inline void vmsvga_update_rect(struct > >> vmsvga_state_s *s, > >> > >> uint8_t *src; > >> uint8_t *dst; > >> > >> + if (x < 0) { > >> + fprintf(stderr, "%s: update x was < 0 (%d)\n", __func__, x); > >> + w += x; > >> + x = 0; > >> + } > >> + if (w < 0) { > >> + fprintf(stderr, "%s: update w was < 0 (%d)\n", __func__, w); > >> + w = 0; > >> + } > >> > >> if (x + w > ds_get_width(s->vga.ds)) { > >> > >> fprintf(stderr, "%s: update width too large x: %d, w: %d\n", > >> > >> __func__, x, w); > >> > >> @@ -303,6 +312,15 @@ static inline void vmsvga_update_rect(struct > >> vmsvga_state_s *s, > >> > >> w = ds_get_width(s->vga.ds) - x; > >> > >> } > >> > >> + if (y < 0) { > >> + fprintf(stderr, "%s: update y was < 0 (%d)\n", __func__, y); > >> + h += y; > >> + y = 0; > >> + } > >> + if (h < 0) { > >> + fprintf(stderr, "%s: update h was < 0 (%d)\n", __func__, h); > >> + h = 0; > >> + } > >> > >> if (y + h > ds_get_height(s->vga.ds)) { > >> > >> fprintf(stderr, "%s: update height too large y: %d, h: %d\n", > >> > >> __func__, y, h); > >> > >> -- > >> 1.7.10.4 Best regards, Marek Vasut ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-02-01 13:02 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1359134604-27516-1-git-send-email-mjt@msgid.tls.msk.ru> [not found] ` <1359134604-27516-2-git-send-email-mjt@msgid.tls.msk.ru> [not found] ` <CAAu8pHv97oQqf9JVXdtg-OL-do8n5L3mivYfLYXDsDgq_r3VKQ@mail.gmail.com> 2013-02-01 12:57 ` [Qemu-devel] [PATCH v2] vmware_vga: fix out of bounds and invalid rects updating Michael Tokarev 2013-02-01 13:01 ` Marek Vasut
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).