GVariant: validate that passed string is UTF-8
authorDavid Zeuthen <davidz@redhat.com>
Tue, 3 Aug 2010 17:33:03 +0000 (13:33 -0400)
committerDavid Zeuthen <davidz@redhat.com>
Tue, 3 Aug 2010 17:38:50 +0000 (13:38 -0400)
commit5e6f762d61db1a5c64bd1d33e5ba112755106581
treeb2db38fbdf11b7bd9fe565df134fb49f04ec664c
parent86d947f01fba4b79aa9f0bdcea9d510f5411ea4b
GVariant: validate that passed string is UTF-8

As discussed with Ryan on IRC.

This check is crucial because it guarantees that
g_variant_get_string() will _always_ return valid UTF-8. Except in
cases where the programmer used unsafe API such as
g_variant_new_from_data() and setting @trusted to TRUE.

In fact, this check revealed a flaw in my polkit gdbus port

 (lt-polkitd:11632): GLib-CRITICAL **: g_variant_new_string: assertion
 `g_utf8_validate (string, len, NULL)' failed

and with this I could easily find the problem by using gdb(1) and
G_DBUS=fatal-warnings.

Without this check we'd pass the non-UTF8 string all the way to the
message bus and the bus would then disconnect us. So instead I was
seeing

  g_dbus_connection_real_closed: Remote peer vanished with error:
  Underlying GIOStream returned 0 bytes on an async read
  (g-io-error-quark, 0). Exiting.

and then SIGTERM as raised by g_dbus_connection_real_closed() and my
polkitd process would exit. This behavior is much harder to debug than
failing early (as this patch implements).

Signed-off-by: David Zeuthen <davidz@redhat.com>
glib/gvariant.c