Skip to content

Commit

Permalink
[mms-settings] Be tolerant to variations of integer data types
Browse files Browse the repository at this point in the history
We will accept any kind of integer where we expect uint32 provided
that its value falls into [0..UINT_MAX] range.
  • Loading branch information
monich committed Jul 17, 2014
1 parent 518b8e0 commit dc52d26
Showing 1 changed file with 64 additions and 6 deletions.
70 changes: 64 additions & 6 deletions mms-settings-dconf/src/mms_settings_dconf.c
Expand Up @@ -60,6 +60,60 @@ typedef struct mms_settings_dconf_key {
void (*fn_update)(MMSSettingsSimDataCopy* dest, GVariant* variant);
} MMSSettingsDconfKey;

static
gboolean
mms_settings_dconf_get_uint32(
GVariant* variant,
unsigned int* value)
{
if (variant) {
GVariantClass klass = g_variant_classify(variant);
if (klass == G_VARIANT_CLASS_UINT32) {
/* Normal, most common use case */
*value = g_variant_get_uint32(variant);
return TRUE;
} else if (klass == G_VARIANT_CLASS_INT32) {
/* Typical result of updating dconf value from command line */
gint32 i32 = g_variant_get_int32(variant);
MMS_ASSERT(i32 >= 0);
if (i32 >= 0) {
*value = i32;
return TRUE;
}
/* The rest is not so typical */
} else if (klass == G_VARIANT_CLASS_INT16) {
gint16 i16 = g_variant_get_int16(variant);
MMS_ASSERT(i16 >= 0);
if (i16 >= 0) {
*value = i16;
return TRUE;
}
} else if (klass == G_VARIANT_CLASS_INT64) {
gint64 i64 = g_variant_get_int64(variant);
MMS_ASSERT(i64 >= 0 && i64 <= (gint64)UINT_MAX);
if (i64 >= 0 && i64 <= (gint64)UINT_MAX) {
*value = (unsigned int)i64;
return TRUE;
}
} else if (klass == G_VARIANT_CLASS_BYTE) {
*value = g_variant_get_byte(variant);
return TRUE;
} else if (klass == G_VARIANT_CLASS_UINT16) {
*value = g_variant_get_uint16(variant);
return TRUE;
} else if (klass == G_VARIANT_CLASS_UINT64) {
guint64 u64 = g_variant_get_uint64(variant);
if (u64 <= UINT_MAX) {
*value = (guint32)u64;
return TRUE;
}
} else {
MMS_ERR("Unexpected variant type \'%c\'", (char)klass);
}
}
return FALSE;
}

static
void
mms_settings_dconf_update_user_agent(
Expand Down Expand Up @@ -90,9 +144,11 @@ mms_settings_dconf_update_size_limit(
MMSSettingsSimDataCopy* dest,
GVariant* variant)
{
unsigned int value = g_variant_get_uint32(variant);
MMS_DEBUG(MMS_DCONF_KEY_SIZE_LIMIT " = %u", value);
dest->data.size_limit = value;
if (mms_settings_dconf_get_uint32(variant, &dest->data.size_limit)) {
MMS_DEBUG(MMS_DCONF_KEY_SIZE_LIMIT " = %u", dest->data.size_limit);
} else {
MMS_WARN("Unable to decode " MMS_DCONF_KEY_SIZE_LIMIT " value");
}
}

static
Expand All @@ -101,9 +157,11 @@ mms_settings_dconf_update_max_pixels(
MMSSettingsSimDataCopy* dest,
GVariant* variant)
{
unsigned int value = g_variant_get_uint32(variant);
MMS_DEBUG(MMS_DCONF_KEY_MAX_PIXELS " = %u", value);
dest->data.max_pixels = value;
if (mms_settings_dconf_get_uint32(variant, &dest->data.max_pixels)) {
MMS_DEBUG(MMS_DCONF_KEY_MAX_PIXELS " = %u", dest->data.max_pixels);
} else {
MMS_WARN("Unable to decode " MMS_DCONF_KEY_MAX_PIXELS " value");
}
}

static
Expand Down

0 comments on commit dc52d26

Please sign in to comment.