Bug#591075: glib2.0 segv

Ulrich Weigand uweigand at de.ibm.com
Fri Aug 6 13:37:30 UTC 2010


Alexander Sack asked me to look into this.

I can reproduce the problem on Ubuntu maverick, and I fact I get this
compile-time warning that already indicates the problem:
In function 'memset',
    inlined from 'g_bsearch_array_create' at /home/uweigand/linaro/glib2.0-2.25.12/glib/gbsearcharray.h:137,
    inlined from 'g_signal_init' at /home/uweigand/linaro/glib2.0-2.25.12/gobject/gsignal.c:775:
//usr/include/bits/string3.h:86: warning: call to __builtin___memset_chk will always overflow destination buffer


What's going on here is that everything is inlined into g_signal_init,
and the whole computation of "size" can be done at compile time.  This means:

  size = sizeof (GBSearchArray) + bconfig->sizeof_node;
  if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
    size = G_BSEARCH_UPPER_POWER2 (size);

gets simplified to

  size = sizeof (GBSearchArray) + sizeof (SignalKey);
  size = G_BSEARCH_UPPER_POWER2 (size);

which becomes

  size = sizeof (GBSearchArray) + sizeof (SignalKey);
  size = 1 << g_bit_storage (size - 1);

which in turn is

  size = sizeof (GBSearchArray) + sizeof (SignalKey);
  size = 1 << (((GLIB_SIZEOF_LONG * 8 - 1) ^ __builtin_clzl (size - 1)) + 1);

Now the problem is that GLIB_SIZEOF_LONG is defined to 8,
even though this is a 32-bit build and sizeof (unsigned long) is 4.

This causes the shift size to be some value greater than 32,
and the result of the shift to be undefined, which happens to
be optimized to 0.

The reason for the wrong GLIB_SIZEOF_LONG seems to be a build issue.
The value is picked up from a file glib2.0-2.25.12/glib/glibconfig.h
which appears to have been generated on a 64-bit machine.

There is also another, apparently correct, version in
glib2.0-2.25.12/debian/build/deb/glib/glibconfig.h
but due to include path ordering, the one in glib/ gets picked up.

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand at de.ibm.com






More information about the pkg-gnome-maintainers mailing list