Fix memory leaks in the gdbus introspection parser

We were getting our length zero, yet NULL-terminated arrays in
a twist in some places. Stop passing around ignored length arguments
at the same time.
https://bugzilla.gnome.org/show_bug.cgi?id=635099
This commit is contained in:
Matthias Clasen 2011-02-15 02:27:54 -05:00
parent b21b3a01c7
commit f9ad7baf31
2 changed files with 68 additions and 113 deletions

View File

@ -420,10 +420,10 @@ g_dbus_node_info_unref (GDBusNodeInfo *info)
/* ---------------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------------- */
static void static void
g_dbus_annotation_info_set (ParseData *data, g_dbus_annotation_info_set (ParseData *data,
GDBusAnnotationInfo *info, GDBusAnnotationInfo *info,
const gchar *key, const gchar *key,
const gchar *value, const gchar *value,
GDBusAnnotationInfo **embedded_annotations) GDBusAnnotationInfo **embedded_annotations)
{ {
info->ref_count = 1; info->ref_count = 1;
@ -462,9 +462,7 @@ static void
g_dbus_method_info_set (ParseData *data, g_dbus_method_info_set (ParseData *data,
GDBusMethodInfo *info, GDBusMethodInfo *info,
const gchar *name, const gchar *name,
guint in_num_args,
GDBusArgInfo **in_args, GDBusArgInfo **in_args,
guint out_num_args,
GDBusArgInfo **out_args, GDBusArgInfo **out_args,
GDBusAnnotationInfo **annotations) GDBusAnnotationInfo **annotations)
{ {
@ -473,17 +471,11 @@ g_dbus_method_info_set (ParseData *data,
if (name != NULL) if (name != NULL)
info->name = g_strdup (name); info->name = g_strdup (name);
if (in_num_args != 0) if (in_args != NULL)
{ info->in_args = in_args;
//info->in_num_args = in_num_args;
info->in_args = in_args;
}
if (out_num_args != 0) if (out_args != NULL)
{ info->out_args = out_args;
//info->out_num_args = out_num_args;
info->out_args = out_args;
}
if (annotations != NULL) if (annotations != NULL)
info->annotations = annotations; info->annotations = annotations;
@ -493,7 +485,6 @@ static void
g_dbus_signal_info_set (ParseData *data, g_dbus_signal_info_set (ParseData *data,
GDBusSignalInfo *info, GDBusSignalInfo *info,
const gchar *name, const gchar *name,
guint num_args,
GDBusArgInfo **args, GDBusArgInfo **args,
GDBusAnnotationInfo **annotations) GDBusAnnotationInfo **annotations)
{ {
@ -502,16 +493,11 @@ g_dbus_signal_info_set (ParseData *data,
if (name != NULL) if (name != NULL)
info->name = g_strdup (name); info->name = g_strdup (name);
if (num_args != 0) if (args != NULL)
{ info->args = args;
//info->num_args = num_args;
info->args = args;
}
if (annotations != NULL) if (annotations != NULL)
{ info->annotations = annotations;
info->annotations = annotations;
}
} }
static void static void
@ -531,66 +517,44 @@ g_dbus_property_info_set (ParseData *data,
info->flags = flags; info->flags = flags;
if (signature != NULL) if (signature != NULL)
{ info->signature = g_strdup (signature);
info->signature = g_strdup (signature);
}
if (annotations != NULL) if (annotations != NULL)
{ info->annotations = annotations;
info->annotations = annotations;
}
} }
static void static void
g_dbus_interface_info_set (ParseData *data, g_dbus_interface_info_set (ParseData *data,
GDBusInterfaceInfo *info, GDBusInterfaceInfo *info,
const gchar *name, const gchar *name,
guint num_methods,
GDBusMethodInfo **methods, GDBusMethodInfo **methods,
guint num_signals,
GDBusSignalInfo **signals, GDBusSignalInfo **signals,
guint num_properties,
GDBusPropertyInfo **properties, GDBusPropertyInfo **properties,
GDBusAnnotationInfo **annotations) GDBusAnnotationInfo **annotations)
{ {
info->ref_count = 1; info->ref_count = 1;
if (name != NULL) if (name != NULL)
{ info->name = g_strdup (name);
info->name = g_strdup (name);
}
if (num_methods != 0) if (methods != NULL)
{ info->methods = methods;
//info->num_methods = num_methods;
info->methods = methods;
}
if (num_signals != 0) if (signals != NULL)
{ info->signals = signals;
//info->num_signals = num_signals;
info->signals = signals;
}
if (num_properties != 0) if (properties != NULL)
{ info->properties = properties;
//info->num_properties = num_properties;
info->properties = properties;
}
if (annotations != NULL) if (annotations != NULL)
{ info->annotations = annotations;
info->annotations = annotations;
}
} }
static void static void
g_dbus_node_info_set (ParseData *data, g_dbus_node_info_set (ParseData *data,
GDBusNodeInfo *info, GDBusNodeInfo *info,
const gchar *path, const gchar *path,
guint num_interfaces,
GDBusInterfaceInfo **interfaces, GDBusInterfaceInfo **interfaces,
guint num_nodes,
GDBusNodeInfo **nodes, GDBusNodeInfo **nodes,
GDBusAnnotationInfo **annotations) GDBusAnnotationInfo **annotations)
{ {
@ -602,31 +566,22 @@ g_dbus_node_info_set (ParseData *data,
/* TODO: relative / absolute path snafu */ /* TODO: relative / absolute path snafu */
} }
if (num_interfaces != 0) if (interfaces != NULL)
{ info->interfaces = interfaces;
//info->num_interfaces = num_interfaces;
info->interfaces = interfaces;
}
if (num_nodes != 0) if (nodes != NULL)
{ info->nodes = nodes;
//info->num_nodes = num_nodes;
info->nodes = nodes;
}
if (annotations != NULL) if (annotations != NULL)
{ info->annotations = annotations;
info->annotations = annotations;
}
} }
/* ---------------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------------- */
static void static void
g_dbus_annotation_info_generate_xml (GDBusAnnotationInfo *info, g_dbus_annotation_info_generate_xml (GDBusAnnotationInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -655,10 +610,10 @@ g_dbus_annotation_info_generate_xml (GDBusAnnotationInfo *info,
} }
static void static void
g_dbus_arg_info_generate_xml (GDBusArgInfo *info, g_dbus_arg_info_generate_xml (GDBusArgInfo *info,
guint indent, guint indent,
const gchar *extra_attributes, const gchar *extra_attributes,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -691,9 +646,9 @@ g_dbus_arg_info_generate_xml (GDBusArgInfo *info,
} }
static void static void
g_dbus_method_info_generate_xml (GDBusMethodInfo *info, g_dbus_method_info_generate_xml (GDBusMethodInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -731,9 +686,9 @@ g_dbus_method_info_generate_xml (GDBusMethodInfo *info,
} }
static void static void
g_dbus_signal_info_generate_xml (GDBusSignalInfo *info, g_dbus_signal_info_generate_xml (GDBusSignalInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -765,9 +720,9 @@ g_dbus_signal_info_generate_xml (GDBusSignalInfo *info,
} }
static void static void
g_dbus_property_info_generate_xml (GDBusPropertyInfo *info, g_dbus_property_info_generate_xml (GDBusPropertyInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
const gchar *access_string; const gchar *access_string;
@ -830,9 +785,9 @@ g_dbus_property_info_generate_xml (GDBusPropertyInfo *info,
* Since: 2.26 * Since: 2.26
*/ */
void void
g_dbus_interface_info_generate_xml (GDBusInterfaceInfo *info, g_dbus_interface_info_generate_xml (GDBusInterfaceInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -877,9 +832,9 @@ g_dbus_interface_info_generate_xml (GDBusInterfaceInfo *info,
* Since: 2.26 * Since: 2.26
*/ */
void void
g_dbus_node_info_generate_xml (GDBusNodeInfo *info, g_dbus_node_info_generate_xml (GDBusNodeInfo *info,
guint indent, guint indent,
GString *string_builder) GString *string_builder)
{ {
guint n; guint n;
@ -1276,6 +1231,9 @@ parse_data_free (ParseData *data)
parse_data_free_methods (data); parse_data_free_methods (data);
parse_data_free_signals (data); parse_data_free_signals (data);
parse_data_free_properties (data); parse_data_free_properties (data);
parse_data_free_interfaces (data);
parse_data_free_annotations (data);
parse_data_free_nodes (data);
g_free (data); g_free (data);
} }
@ -1331,8 +1289,8 @@ parser_start_element (GMarkupParseContext *context,
g_dbus_node_info_set (data, g_dbus_node_info_set (data,
parse_data_get_node (data, TRUE), parse_data_get_node (data, TRUE),
name, name,
0, NULL, NULL,
0, NULL, NULL,
NULL); NULL);
/* push the currently retrieved interfaces and nodes on the stack and prepare new arrays */ /* push the currently retrieved interfaces and nodes on the stack and prepare new arrays */
@ -1368,9 +1326,9 @@ parser_start_element (GMarkupParseContext *context,
g_dbus_interface_info_set (data, g_dbus_interface_info_set (data,
parse_data_get_interface (data, TRUE), parse_data_get_interface (data, TRUE),
name, name,
0, NULL, NULL,
0, NULL, NULL,
0, NULL, NULL,
NULL); NULL);
} }
@ -1397,8 +1355,8 @@ parser_start_element (GMarkupParseContext *context,
g_dbus_method_info_set (data, g_dbus_method_info_set (data,
parse_data_get_method (data, TRUE), parse_data_get_method (data, TRUE),
name, name,
0, NULL, NULL,
0, NULL, NULL,
NULL); NULL);
data->num_args = 0; data->num_args = 0;
@ -1427,7 +1385,7 @@ parser_start_element (GMarkupParseContext *context,
g_dbus_signal_info_set (data, g_dbus_signal_info_set (data,
parse_data_get_signal (data, TRUE), parse_data_get_signal (data, TRUE),
name, name,
0, NULL, NULL,
NULL); NULL);
data->num_args = 0; data->num_args = 0;
@ -1660,9 +1618,7 @@ parser_end_element (GMarkupParseContext *context,
g_dbus_node_info_set (data, g_dbus_node_info_set (data,
parse_data_get_node (data, FALSE), parse_data_get_node (data, FALSE),
NULL, NULL,
num_interfaces,
interfaces, interfaces,
num_nodes,
nodes, nodes,
steal_annotations (data)); steal_annotations (data));
@ -1683,11 +1639,8 @@ parser_end_element (GMarkupParseContext *context,
g_dbus_interface_info_set (data, g_dbus_interface_info_set (data,
parse_data_get_interface (data, FALSE), parse_data_get_interface (data, FALSE),
NULL, NULL,
num_methods,
methods, methods,
num_signals,
signals, signals,
num_properties,
properties, properties,
steal_annotations (data)); steal_annotations (data));
@ -1705,9 +1658,7 @@ parser_end_element (GMarkupParseContext *context,
g_dbus_method_info_set (data, g_dbus_method_info_set (data,
parse_data_get_method (data, FALSE), parse_data_get_method (data, FALSE),
NULL, NULL,
in_num_args,
in_args, in_args,
out_num_args,
out_args, out_args,
steal_annotations (data)); steal_annotations (data));
} }
@ -1721,7 +1672,6 @@ parser_end_element (GMarkupParseContext *context,
g_dbus_signal_info_set (data, g_dbus_signal_info_set (data,
parse_data_get_signal (data, FALSE), parse_data_get_signal (data, FALSE),
NULL, NULL,
num_args,
args, args,
steal_annotations (data)); steal_annotations (data));
} }
@ -1838,6 +1788,9 @@ g_dbus_node_info_new_for_xml (const gchar *xml_data,
error)) error))
goto out; goto out;
if (!g_markup_parse_context_end_parse (context, error))
goto out;
ughret = parse_data_steal_nodes (data, &num_nodes); ughret = parse_data_steal_nodes (data, &num_nodes);
if (num_nodes != 1) if (num_nodes != 1)
@ -1854,10 +1807,11 @@ g_dbus_node_info_new_for_xml (const gchar *xml_data,
for (n = 0; n < num_nodes; n++) for (n = 0; n < num_nodes; n++)
{ {
for (n = 0; n < num_nodes; n++) for (n = 0; n < num_nodes; n++)
g_dbus_node_info_unref (&(ret[n])); {
g_dbus_node_info_unref (ughret[n]);
ughret[n] = NULL;
}
} }
g_free (ret);
ret = NULL;
} }
ret = ughret[0]; ret = ughret[0];

View File

@ -75,7 +75,8 @@ test_introspection (GDBusProxy *proxy)
g_assert (method_info == NULL); g_assert (method_info == NULL);
method_info = g_dbus_interface_info_lookup_method (interface_info, "Introspect"); method_info = g_dbus_interface_info_lookup_method (interface_info, "Introspect");
g_assert (method_info != NULL); g_assert (method_info != NULL);
g_assert (method_info->in_args == NULL); g_assert (method_info->in_args != NULL);
g_assert (method_info->in_args[0] == NULL);
g_assert (method_info->out_args != NULL); g_assert (method_info->out_args != NULL);
g_assert (method_info->out_args[0] != NULL); g_assert (method_info->out_args[0] != NULL);
g_assert (method_info->out_args[1] == NULL); g_assert (method_info->out_args[1] == NULL);