mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
gst/: GLib 2.6 g_flags_get_first_value has a bug that triggers an infinite loop
Original commit message from CVS: * gst/glib-compat.c: (gst_flags_get_first_value): * gst/glib-compat.h: * gst/gstvalue.c: (gst_value_deserialize_int_helper), (gst_value_compare_double), (gst_value_serialize_flags): GLib 2.6 g_flags_get_first_value has a bug that triggers an infinite loop
This commit is contained in:
parent
d4ea9fbeba
commit
eecd25e78f
4 changed files with 45 additions and 1 deletions
|
@ -1,3 +1,12 @@
|
|||
2005-10-13 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* gst/glib-compat.c: (gst_flags_get_first_value):
|
||||
* gst/glib-compat.h:
|
||||
* gst/gstvalue.c: (gst_value_deserialize_int_helper),
|
||||
(gst_value_compare_double), (gst_value_serialize_flags):
|
||||
GLib 2.6 g_flags_get_first_value has a bug that triggers an
|
||||
infinite loop
|
||||
|
||||
2005-10-13 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||
|
||||
* gst/base/gstbasesink.c: (gst_base_sink_handle_object):
|
||||
|
|
|
@ -264,3 +264,32 @@ g_stat (const gchar * filename, struct stat *buf)
|
|||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This version is copied from GLib 2.8.
|
||||
* In GLib 2.6, it didn't check for a flag value being NULL, hence it
|
||||
* hits an infinite loop in our flags serialize function
|
||||
*/
|
||||
GFlagsValue *
|
||||
gst_flags_get_first_value (GFlagsClass * flags_class, guint value)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL);
|
||||
|
||||
if (flags_class->n_values) {
|
||||
GFlagsValue *flags_value;
|
||||
|
||||
if (value == 0) {
|
||||
for (flags_value = flags_class->values; flags_value->value_name;
|
||||
flags_value++)
|
||||
if (flags_value->value == 0)
|
||||
return flags_value;
|
||||
} else {
|
||||
for (flags_value = flags_class->values; flags_value->value_name;
|
||||
flags_value++)
|
||||
if (flags_value->value != 0
|
||||
&& (flags_value->value & value) == flags_value->value)
|
||||
return flags_value;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* Copyright 2005 David Schleef <ds@schleef.org>
|
||||
*/
|
||||
|
||||
#include <gst_private.h> /* for g_warning */
|
||||
#include <glib.h>
|
||||
#if GLIB_CHECK_VERSION (2, 6, 0)
|
||||
#include <glib/gstdio.h>
|
||||
|
@ -26,5 +27,9 @@ struct stat;
|
|||
int g_stat (const gchar *filename, struct stat *buf);
|
||||
#endif
|
||||
|
||||
#include <glib-object.h>
|
||||
GFlagsValue*
|
||||
gst_flags_get_first_value (GFlagsClass *flags_class,
|
||||
guint value);
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <ctype.h>
|
||||
|
||||
#include "gst_private.h"
|
||||
#include "glib-compat.h"
|
||||
#include <gst/gst.h>
|
||||
#include <gobject/gvaluecollector.h>
|
||||
|
||||
|
@ -1570,7 +1571,7 @@ gst_value_serialize_flags (const GValue * value)
|
|||
result = g_strdup ("");
|
||||
flags = g_value_get_flags (value);
|
||||
while (flags) {
|
||||
fl = g_flags_get_first_value (klass, flags);
|
||||
fl = gst_flags_get_first_value (klass, flags);
|
||||
if (fl != NULL) {
|
||||
tmp = g_strconcat (result, (first ? "" : "+"), fl->value_name, NULL);
|
||||
g_free (result);
|
||||
|
|
Loading…
Reference in a new issue