mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 17:56:17 +01:00
GDBusMessage: Assert various things when serializing to a blob
We use g_assert() instead of setting the GError because it is a programming error if the GVariant contains invalid data - see commit5e6f762d61
for where the last hole in GVariant was closed. So if we can trust GVariant to only contain valid data (ignoring the case where unsafe API such as g_variant_new_from_data() is used), why g_assert() at all with costly g_utf8_validate() checks? Because a) it is relatively inexpensive; and b) it helps find bugs such as the one fixed in commit5e6f762d61
. If performance is a concern we can play games like introducing environment variables or other machinery to avoid such "costly" checks. I doubt it will ever be an issue. Also replace two "Hmm" TODO item with a static assert - the code that serializes a gdouble into the D-Bus wire format by treating it as a guint64 is indeed correct - endianess needs to be taken into account (see the D-Bus reference implementation for similar code). But we want to make sure that we're indeed using an architecture/compiler where a gdouble takes up 8 bytes - hence the assertion. Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
parent
5bd34a820e
commit
6e723e8b3e
@ -947,7 +947,7 @@ parse_value_from_blob (GMemoryInputStream *mis,
|
|||||||
v = g_data_input_stream_read_uint64 (dis, NULL, &local_error);
|
v = g_data_input_stream_read_uint64 (dis, NULL, &local_error);
|
||||||
if (local_error != NULL)
|
if (local_error != NULL)
|
||||||
goto fail;
|
goto fail;
|
||||||
/* TODO: hmm */
|
G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64));
|
||||||
encoded = (gdouble *) &v;
|
encoded = (gdouble *) &v;
|
||||||
ret = g_variant_new_double (*encoded);
|
ret = g_variant_new_double (*encoded);
|
||||||
}
|
}
|
||||||
@ -1690,7 +1690,7 @@ append_value_to_blob (GVariant *value,
|
|||||||
{
|
{
|
||||||
guint64 *encoded;
|
guint64 *encoded;
|
||||||
gdouble v = g_variant_get_double (value);
|
gdouble v = g_variant_get_double (value);
|
||||||
/* TODO: hmm */
|
G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64));
|
||||||
encoded = (guint64 *) &v;
|
encoded = (guint64 *) &v;
|
||||||
g_data_output_stream_put_uint64 (dos, *encoded, NULL, NULL);
|
g_data_output_stream_put_uint64 (dos, *encoded, NULL, NULL);
|
||||||
}
|
}
|
||||||
@ -1701,7 +1701,10 @@ append_value_to_blob (GVariant *value,
|
|||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
{
|
{
|
||||||
gsize len;
|
gsize len;
|
||||||
const gchar *v = g_variant_get_string (value, &len);
|
const gchar *v;
|
||||||
|
const gchar *end;
|
||||||
|
v = g_variant_get_string (value, &len);
|
||||||
|
g_assert (g_utf8_validate (v, -1, &end) && (end == v + len));
|
||||||
g_data_output_stream_put_uint32 (dos, len, NULL, NULL);
|
g_data_output_stream_put_uint32 (dos, len, NULL, NULL);
|
||||||
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
||||||
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
||||||
@ -1712,9 +1715,9 @@ append_value_to_blob (GVariant *value,
|
|||||||
padding_added = ensure_output_padding (mos, dos, 4);
|
padding_added = ensure_output_padding (mos, dos, 4);
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
{
|
{
|
||||||
/* TODO: validate object path */
|
|
||||||
gsize len;
|
gsize len;
|
||||||
const gchar *v = g_variant_get_string (value, &len);
|
const gchar *v = g_variant_get_string (value, &len);
|
||||||
|
g_assert (g_variant_is_object_path (v));
|
||||||
g_data_output_stream_put_uint32 (dos, len, NULL, NULL);
|
g_data_output_stream_put_uint32 (dos, len, NULL, NULL);
|
||||||
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
||||||
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
||||||
@ -1724,9 +1727,9 @@ append_value_to_blob (GVariant *value,
|
|||||||
{
|
{
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
{
|
{
|
||||||
/* TODO: validate signature (including max len being 255) */
|
|
||||||
gsize len;
|
gsize len;
|
||||||
const gchar *v = g_variant_get_string (value, &len);
|
const gchar *v = g_variant_get_string (value, &len);
|
||||||
|
g_assert (g_variant_is_signature (v));
|
||||||
g_data_output_stream_put_byte (dos, len, NULL, NULL);
|
g_data_output_stream_put_byte (dos, len, NULL, NULL);
|
||||||
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
g_data_output_stream_put_string (dos, v, NULL, NULL);
|
||||||
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
||||||
@ -1856,7 +1859,6 @@ append_value_to_blob (GVariant *value,
|
|||||||
const gchar *signature;
|
const gchar *signature;
|
||||||
child = g_variant_get_child_value (value, 0);
|
child = g_variant_get_child_value (value, 0);
|
||||||
signature = g_variant_get_type_string (child);
|
signature = g_variant_get_type_string (child);
|
||||||
/* TODO: validate signature (including max len being 255) */
|
|
||||||
g_data_output_stream_put_byte (dos, strlen (signature), NULL, NULL);
|
g_data_output_stream_put_byte (dos, strlen (signature), NULL, NULL);
|
||||||
g_data_output_stream_put_string (dos, signature, NULL, NULL);
|
g_data_output_stream_put_string (dos, signature, NULL, NULL);
|
||||||
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
g_data_output_stream_put_byte (dos, '\0', NULL, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user