eol reached  https://wiki.ubuntu.com/Releases

** Changed in: libxi (Ubuntu Natty)
       Status: Fix Committed => Invalid

-- 
You received this bug notification because you are a member of Desktop
Packages, which is subscribed to libxi in Ubuntu.
https://bugs.launchpad.net/bugs/770522

Title:
  copyRawEvent() copies data outside of allocated space causing heap
  corruption

Status in X.Org X server:
  Fix Released
Status in “libxi” package in Ubuntu:
  Fix Released
Status in “libxi” source package in Natty:
  Invalid

Bug description:
  [Impact]
  Causes crashes in applications using Raw Motion support from XI2

  [Development Fix]
  Fix is committed to upstream git tree, which we'll get when we update libXi.  
Meanwhile, a cherrypick of the patch has been included in our current libxi 
package in oneiric; this patch can be dropped when we merge from debian.

  [Stable Fix]
  Same cherrypick patch for oneiric is used for natty, just different package 
version.

  [Test Case]
  See test case code shown below.

  [Regression Potential]
  The patch fixes a fairly obvious typo in the code.  It strictly increases the 
size of memory allocation, so there is no risk of overwriting memory due to 
erroneous assumptions elsewhere in the code.  This patch has been upstream for 
a bit and received a suitable amount of testing.

  [Original Report]
  This fixes what I believe is a bug in libxi which causes my application to 
crash.  I have reported it to FreeDesktop.org

  https://bugs.freedesktop.org/show_bug.cgi?id=36592

  diff ../../libXi-1.3-orig/src/XExtInt.c src/XExtInt.c
  1196c1196
  <     ptr = cookie_out->data = malloc(sizeof(XIRawEvent));
  ---
  >     ptr = cookie_out->data = malloc(len);

  In trying to understand a heap corruption when I added XI2 RawMotion event
  handling to our Xinput-based application, I came across the following routine
  copyRawEvent() in libxi-1.3/src/XExtInt.c.  My question is what is the purpose
  of computing "len" if it is not used?  Should it have been used as an argument
  to malloc().

  copyRawEvent(XGenericEventCookie *cookie_in,
               XGenericEventCookie *cookie_out)
  {
      XIRawEvent *in, *out;
      void *ptr;
      int len;
      int bits;

      in = cookie_in->data;

      bits = count_bits(in->valuators.mask, in->valuators.mask_len);
      len = sizeof(XIRawEvent) + in->valuators.mask_len;
      len += bits * sizeof(double) * 2;

      ptr = cookie_out->data = malloc(sizeof(XIRawEvent));
      if (!ptr)
          return False;

      out = next_block(&ptr, sizeof(XIRawEvent));
      *out = *in;
      out->valuators.mask = next_block(&ptr, out->valuators.mask_len);
      memcpy(out->valuators.mask, in->valuators.mask, out->valuators.mask_len);

      out->valuators.values = next_block(&ptr, bits * sizeof(double));
      memcpy(out->valuators.values, in->valuators.values, bits * 
sizeof(double));

      out->raw_values = next_block(&ptr, bits * sizeof(double));
      memcpy(out->raw_values, in->raw_values, bits * sizeof(double));

      return True;
  }

  When I use valgrind, I get the following output as the culprit for the
  crash

  ==4166== Invalid write of size 1
  ==4166==    at 0x4C29F04: memcpy (mc_replace_strmem.c:497)
  ==4166==    by 0x8F39180: ??? (in /usr/lib/libXi.so.6.1.0)
  ==4166==    by 0x7433D48: _XCopyEventCookie (in /usr/lib/libX11.so.6.3.0)
  ==4166==    by 0x7425166: XPeekEvent (in /usr/lib/libX11.so.6.3.0)
  ==4166==    by 0x49C3E3: process_key (x11_be.c:1065)
  ==4166==    by 0x49EA5C: event_key_release (x11_be.c:2201)
  ==4166==    by 0x49DD6E: x11_be_process_events (x11_be.c:1892)
  ==4166==    by 0x4A38F4: x11_be_main_loop (x11_be.c:4353)
  ==4166==    by 0x4A39E1: x11_be_thread_main (x11_be.c:4385)
  ==4166==    by 0x87549C9: start_thread (pthread_create.c:300)
  ==4166==    by 0x8A516FC: clone (clone.S:112)
  ==4166==  Address 0x168afe80 is 0 bytes after a block of size 96 alloc'd
  ==4166==    at 0x4C284A8: malloc (vg_replace_malloc.c:236)
  ==4166==    by 0x8F390BD: ??? (in /usr/lib/libXi.so.6.1.0)
  ==4166==    by 0x7433D48: _XCopyEventCookie (in /usr/lib/libX11.so.6.3.0)
  ==4166==    by 0x7425166: XPeekEvent (in /usr/lib/libX11.so.6.3.0)
  ==4166==    by 0x49C3E3: process_key (x11_be.c:1065)
  ==4166==    by 0x49EA5C: event_key_release (x11_be.c:2201)
  ==4166==    by 0x49DD6E: x11_be_process_events (x11_be.c:1892)
  ==4166==    by 0x4A38F4: x11_be_main_loop (x11_be.c:4353)
  ==4166==    by 0x4A39E1: x11_be_thread_main (x11_be.c:4385)
  ==4166==    by 0x87549C9: start_thread (pthread_create.c:300)

  Thanks in advance,

  Roger R. Cruz

To manage notifications about this bug go to:
https://bugs.launchpad.net/xorg-server/+bug/770522/+subscriptions

-- 
Mailing list: https://launchpad.net/~desktop-packages
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~desktop-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to