X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fgvariant-serialiser.c;h=5df7fc3ab45d7372ed68471d2e377f57c7f3d4d6;hb=40650e33239994237917322d4cfecc34e4cc4394;hp=f07251176550f8f8fd494792361d9a635ed3ddee;hpb=0e0554bd62e897f001aaa9388345c1d4e62614af;p=platform%2Fupstream%2Fglib.git diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c index f072511..5df7fc3 100644 --- a/glib/gvariant-serialiser.c +++ b/glib/gvariant-serialiser.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . * * Author: Ryan Lortie */ @@ -89,7 +87,7 @@ /* < private > * GVariantSerialised: * @type_info: the #GVariantTypeInfo of this value - * @data: the serialised data of this value, or %NULL + * @data: (allow-none): the serialised data of this value, or %NULL * @size: the size of this value * * A structure representing a GVariant in serialised form. This @@ -552,6 +550,7 @@ gvs_fixed_sized_array_is_normal (GVariantSerialised value) * normal form and that is the one that the serialiser must produce. */ +/* bytes may be NULL if (size == 0). */ static inline gsize gvs_read_unaligned_le (guchar *bytes, guint size) @@ -563,7 +562,8 @@ gvs_read_unaligned_le (guchar *bytes, } tmpvalue; tmpvalue.integer = 0; - memcpy (&tmpvalue.bytes, bytes, size); + if (bytes != NULL) + memcpy (&tmpvalue.bytes, bytes, size); return GSIZE_FROM_LE (tmpvalue.integer); } @@ -918,7 +918,7 @@ gvs_tuple_get_child (GVariantSerialised value, child.size = fixed_size; } - else /* G_VARIANT_MEMEBER_ENDING_OFFSET */ + else /* G_VARIANT_MEMBER_ENDING_OFFSET */ end = gvs_read_unaligned_le (value.data + value.size - offset_size * (member_info->i + 2), offset_size); @@ -1023,6 +1023,10 @@ gvs_tuple_is_normal (GVariantSerialised value) gsize offset; gsize i; + /* as per the comment in gvs_tuple_get_child() */ + if G_UNLIKELY (value.data == NULL && value.size != 0) + return FALSE; + offset_size = gvs_get_offset_size (value.size); length = g_variant_type_info_n_members (value.type_info); offset_ptr = value.size; @@ -1593,11 +1597,20 @@ gboolean g_variant_serialiser_is_string (gconstpointer data, gsize size) { + const gchar *expected_end; const gchar *end; + if (size == 0) + return FALSE; + + expected_end = ((gchar *) data) + size - 1; + + if (*expected_end != '\0') + return FALSE; + g_utf8_validate (data, size, &end); - return data == end - (size - 1); + return end == expected_end; } /* < private >