diff options
| author | Robert Ancell <robert.ancell@canonical.com> | 2020-04-07 09:33:35 +1200 |
|---|---|---|
| committer | Robert Ancell <robert.ancell@canonical.com> | 2020-04-07 09:42:21 +1200 |
| commit | c4bec6bee7b993930a5223549263668d8612d815 (patch) | |
| tree | 388295033258ff2ff17f0d1f25286fe7ac6aa606 /json-glib/json-gvariant.c | |
| parent | cf76724f3e495caa413694b3aa699458140b6b81 (diff) | |
| download | json-glib-c4bec6bee7b993930a5223549263668d8612d815.tar.gz | |
json-gvariant: Fix poorly written patch in 212f925
Don't double do the integer conversion.
Catch errors in double conversion.
Do correct unsiged conversion.
Friends don't let friends do end-of-day last minute MRs.
Diffstat (limited to 'json-glib/json-gvariant.c')
| -rw-r--r-- | json-glib/json-gvariant.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/json-glib/json-gvariant.c b/json-glib/json-gvariant.c index a86507a..72df81d 100644 --- a/json-glib/json-gvariant.c +++ b/json-glib/json-gvariant.c @@ -843,6 +843,7 @@ gvariant_simple_from_string (const gchar *st, gboolean conversion_error = FALSE; gint64 signed_value; guint64 unsigned_value; + gdouble double_value; errno = 0; @@ -872,17 +873,17 @@ gvariant_simple_from_string (const gchar *st, case G_VARIANT_CLASS_UINT16: signed_value = g_ascii_strtoll (st, &nptr, 10); conversion_error = errno != 0 || nptr == st; - variant = g_variant_new_uint16 (g_ascii_strtoll (st, &nptr, 10)); + variant = g_variant_new_uint16 (signed_value); break; case G_VARIANT_CLASS_INT32: signed_value = g_ascii_strtoll (st, &nptr, 10); conversion_error = errno != 0 || nptr == st; - variant = g_variant_new_int32 (g_ascii_strtoll (st, &nptr, 10)); + variant = g_variant_new_int32 (signed_value); break; case G_VARIANT_CLASS_UINT32: - unsigned_value = g_ascii_strtoll (st, &nptr, 10); + unsigned_value = g_ascii_strtoull (st, &nptr, 10); conversion_error = errno != 0 || nptr == st; variant = g_variant_new_uint32 (unsigned_value); break; @@ -890,11 +891,11 @@ gvariant_simple_from_string (const gchar *st, case G_VARIANT_CLASS_INT64: signed_value = g_ascii_strtoll (st, &nptr, 10); conversion_error = errno != 0 || nptr == st; - variant = g_variant_new_int64 (g_ascii_strtoll (st, &nptr, 10)); + variant = g_variant_new_int64 (signed_value); break; case G_VARIANT_CLASS_UINT64: - unsigned_value = g_ascii_strtoll (st, &nptr, 10); + unsigned_value = g_ascii_strtoull (st, &nptr, 10); conversion_error = errno != 0 || nptr == st; variant = g_variant_new_uint64 (unsigned_value); break; @@ -906,7 +907,9 @@ gvariant_simple_from_string (const gchar *st, break; case G_VARIANT_CLASS_DOUBLE: - variant = g_variant_new_double (g_ascii_strtod (st, &nptr)); + double_value = g_ascii_strtod (st, &nptr); + conversion_error = errno != 0 || nptr == st; + variant = g_variant_new_double (double_value); break; case G_VARIANT_CLASS_STRING: |
