diff --git a/gst/gstbufferlist.c b/gst/gstbufferlist.c index 59fbcafc5f..0bfdcd5dbf 100644 --- a/gst/gstbufferlist.c +++ b/gst/gstbufferlist.c @@ -307,8 +307,11 @@ gst_buffer_list_foreach (GstBufferList * list, GstBufferListFunc func, gst_buffer_list_remove_range_internal (list, i, 1, !was_writable); --len; } else { - if (!was_writable) + if (!was_writable) { + gst_mini_object_remove_parent (GST_MINI_OBJECT_CAST (buf), + GST_MINI_OBJECT_CAST (list)); gst_buffer_unref (buf); + } list->buffers[i] = buf_ret; gst_mini_object_add_parent (GST_MINI_OBJECT_CAST (buf_ret), diff --git a/tests/check/gst/gstbufferlist.c b/tests/check/gst/gstbufferlist.c index 1a483d93a7..74a21d4f31 100644 --- a/tests/check/gst/gstbufferlist.c +++ b/tests/check/gst/gstbufferlist.c @@ -539,6 +539,24 @@ GST_START_TEST (test_foreach_modify_non_writeable_list) GST_END_TEST; +GST_START_TEST (test_foreach_modify_writeable_list) +{ + GstBufferList *b = gst_buffer_list_new_sized (1); + GstBuffer *buf; + + buf = gst_buffer_new (); + gst_buffer_list_add (b, gst_buffer_ref (buf)); + + fail_unless (gst_buffer_list_is_writable (b)); + + gst_buffer_list_foreach (b, foreach_replace_buffer, NULL); + + gst_buffer_list_unref (b); + gst_buffer_unref (buf); +} + +GST_END_TEST; + static Suite * gst_buffer_list_suite (void) { @@ -546,6 +564,7 @@ gst_buffer_list_suite (void) TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); + tcase_add_checked_fixture (tc_chain, setup, cleanup); tcase_add_test (tc_chain, test_add_and_iterate); tcase_add_test (tc_chain, test_remove); @@ -559,6 +578,7 @@ gst_buffer_list_suite (void) tcase_add_test (tc_chain, test_new_sized_0); tcase_add_test (tc_chain, test_multiple_mutable_buffer_references); tcase_add_test (tc_chain, test_foreach_modify_non_writeable_list); + tcase_add_test (tc_chain, test_foreach_modify_writeable_list); return s; }