From 1089154f2ab33923f44733b5a2781e84bb01bb54 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 28 Apr 2006 13:13:23 +0000 Subject: [PATCH] gst/gstvalue.c: Don't try to serialize a GValue with a NULL buffer. Original commit message from CVS: * gst/gstvalue.c: (gst_value_serialize_buffer), (gst_value_deserialize_buffer): Don't try to serialize a GValue with a NULL buffer. Fixes #339821. * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite): Added check for serialisation of NULL buffers. --- ChangeLog | 10 +++++++ gst/gstvalue.c | 32 ++++++++++++++-------- tests/check/gst/gstvalue.c | 55 +++++++++++++++++++++++++++++++++++++- 3 files changed, 85 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index a6cb633b3b..f041955297 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-04-28 Wim Taymans + + * gst/gstvalue.c: (gst_value_serialize_buffer), + (gst_value_deserialize_buffer): + Don't try to serialize a GValue with a NULL buffer. + Fixes #339821. + + * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite): + Added check for serialisation of NULL buffers. + 2006-04-28 Wim Taymans * gst/gstminiobject.c: (gst_value_take_mini_object): diff --git a/gst/gstvalue.c b/gst/gstvalue.c index c77a1b2f1e..aff241b9e6 100644 --- a/gst/gstvalue.c +++ b/gst/gstvalue.c @@ -1260,7 +1260,11 @@ gst_value_serialize_buffer (const GValue * value) int i; int size; char *string; - GstBuffer *buffer = GST_BUFFER (gst_value_get_mini_object (value)); + GstBuffer *buffer; + + buffer = gst_value_get_buffer (value); + if (buffer == NULL) + return NULL; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); @@ -1278,7 +1282,6 @@ static gboolean gst_value_deserialize_buffer (GValue * dest, const gchar * s) { GstBuffer *buffer; - gboolean ret = TRUE; int len; char ts[3]; guint8 *data; @@ -1286,14 +1289,14 @@ gst_value_deserialize_buffer (GValue * dest, const gchar * s) len = strlen (s); if (len & 1) - return FALSE; + goto wrong_length; + buffer = gst_buffer_new_and_alloc (len / 2); data = GST_BUFFER_DATA (buffer); for (i = 0; i < len / 2; i++) { - if (!isxdigit ((int) s[i * 2]) || !isxdigit ((int) s[i * 2 + 1])) { - ret = FALSE; - break; - } + if (!isxdigit ((int) s[i * 2]) || !isxdigit ((int) s[i * 2 + 1])) + goto wrong_char; + ts[0] = s[i * 2 + 0]; ts[1] = s[i * 2 + 1]; ts[2] = 0; @@ -1301,10 +1304,17 @@ gst_value_deserialize_buffer (GValue * dest, const gchar * s) data[i] = (guint8) strtoul (ts, NULL, 16); } - if (ret) { - gst_value_take_mini_object (dest, GST_MINI_OBJECT (buffer)); - return TRUE; - } else { + gst_value_take_buffer (dest, buffer); + + return TRUE; + + /* ERRORS */ +wrong_length: + { + return FALSE; + } +wrong_char: + { gst_buffer_unref (buffer); return FALSE; } diff --git a/tests/check/gst/gstvalue.c b/tests/check/gst/gstvalue.c index aa416a9969..6b4ddf1ba0 100644 --- a/tests/check/gst/gstvalue.c +++ b/tests/check/gst/gstvalue.c @@ -31,12 +31,64 @@ GST_START_TEST (test_deserialize_buffer) g_value_init (&value, GST_TYPE_BUFFER); fail_unless (gst_value_deserialize (&value, "1234567890abcdef")); + /* does not increase the refcount */ buf = GST_BUFFER (gst_value_get_mini_object (&value)); + ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1); + /* does not increase the refcount */ + buf = gst_value_get_buffer (&value); ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1); /* cleanup */ - gst_buffer_unref (buf); + g_value_unset (&value); +} + +GST_END_TEST; + +/* create and serialize a buffer */ +GST_START_TEST (test_serialize_buffer) +{ + GValue value = { 0 }; + GstBuffer *buf; + gchar *serialized; + static const char *buf_data = "1234567890abcdef"; + gint len; + + len = strlen (buf_data); + buf = gst_buffer_new_and_alloc (len); + memcpy (GST_BUFFER_DATA (buf), buf_data, len); + ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1); + + /* and assign buffer to mini object */ + g_value_init (&value, GST_TYPE_BUFFER); + gst_value_take_buffer (&value, buf); + ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1); + + /* now serialize it */ + serialized = gst_value_serialize (&value); + GST_DEBUG ("serialized buffer to %s", serialized); + fail_unless (serialized != NULL); + + /* refcount should not change */ + ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1); + + /* cleanup */ + g_free (serialized); + g_value_unset (&value); + + /* take NULL buffer */ + g_value_init (&value, GST_TYPE_BUFFER); + GST_DEBUG ("setting NULL buffer"); + gst_value_take_buffer (&value, NULL); + + /* now serialize it */ + GST_DEBUG ("serializing NULL buffer"); + serialized = gst_value_serialize (&value); + /* should return NULL */ + fail_unless (serialized == NULL); + + g_free (serialized); + g_value_unset (&value); } GST_END_TEST; @@ -1372,6 +1424,7 @@ gst_value_suite (void) suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_deserialize_buffer); + tcase_add_test (tc_chain, test_serialize_buffer); tcase_add_test (tc_chain, test_deserialize_gint); tcase_add_test (tc_chain, test_deserialize_gint_failures); tcase_add_test (tc_chain, test_deserialize_guint);