Don't crash if a node has no name. (start_element_handler): Accept

2004-04-13  Matthias Clasen  <mclasen@redhat.com>

	* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
	has no name.
	(start_element_handler): Accept separators without unique
	names.  (#133302, Anders Carlsson)

	* gtk/gtkuimanager.c (node_remove_ui_reference): Don't leak
	list nodes.  (#138862, Morten Welinder)
This commit is contained in:
Matthias Clasen 2004-04-13 20:06:12 +00:00 committed by Matthias Clasen
parent 5854707bd9
commit 157943b584
8 changed files with 43 additions and 3 deletions

View File

@ -1,5 +1,10 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com> 2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
has no name.
(start_element_handler): Accept separators without unique
names. (#133302, Anders Carlsson)
* gtk/gtkactiongroup.c (gtk_action_group_add_action): Document * gtk/gtkactiongroup.c (gtk_action_group_add_action): Document
possible accelerator gotcha when using this function. (#139641, possible accelerator gotcha when using this function. (#139641,
Christian Persch) Christian Persch)

View File

@ -1,5 +1,10 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com> 2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
has no name.
(start_element_handler): Accept separators without unique
names. (#133302, Anders Carlsson)
* gtk/gtkactiongroup.c (gtk_action_group_add_action): Document * gtk/gtkactiongroup.c (gtk_action_group_add_action): Document
possible accelerator gotcha when using this function. (#139641, possible accelerator gotcha when using this function. (#139641,
Christian Persch) Christian Persch)

View File

@ -1,5 +1,10 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com> 2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
has no name.
(start_element_handler): Accept separators without unique
names. (#133302, Anders Carlsson)
* gtk/gtkactiongroup.c (gtk_action_group_add_action): Document * gtk/gtkactiongroup.c (gtk_action_group_add_action): Document
possible accelerator gotcha when using this function. (#139641, possible accelerator gotcha when using this function. (#139641,
Christian Persch) Christian Persch)

View File

@ -1,5 +1,10 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com> 2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
has no name.
(start_element_handler): Accept separators without unique
names. (#133302, Anders Carlsson)
* gtk/gtkactiongroup.c (gtk_action_group_add_action): Document * gtk/gtkactiongroup.c (gtk_action_group_add_action): Document
possible accelerator gotcha when using this function. (#139641, possible accelerator gotcha when using this function. (#139641,
Christian Persch) Christian Persch)

View File

@ -1,5 +1,10 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com> 2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkuimanager.c (get_child_node): Don't crash if a node
has no name.
(start_element_handler): Accept separators without unique
names. (#133302, Anders Carlsson)
* gtk/gtkactiongroup.c (gtk_action_group_add_action): Document * gtk/gtkactiongroup.c (gtk_action_group_add_action): Document
possible accelerator gotcha when using this function. (#139641, possible accelerator gotcha when using this function. (#139641,
Christian Persch) Christian Persch)

View File

@ -1,3 +1,7 @@
2004-04-13 Matthias Clasen <mclasen@redhat.com>
* gtk/tmpl/gtkuimanager.sgml: Some corrections.
2004-04-13 Federico Mena Quintero <federico@ximian.com> 2004-04-13 Federico Mena Quintero <federico@ximian.com>
* gtk/tmpl/gtkfilechooser.sgml: Typo fix. * gtk/tmpl/gtkfilechooser.sgml: Typo fix.

View File

@ -29,6 +29,7 @@ roughly described by the following DTD.
&lt;!ATTLIST toolbar name &num;IMPLIED &gt; &lt;!ATTLIST toolbar name &num;IMPLIED &gt;
&lt;!ATTLIST popup name &num;IMPLIED &gt; &lt;!ATTLIST popup name &num;IMPLIED &gt;
&lt;!ATTLIST placeholder name &num;IMPLIED &gt; &lt;!ATTLIST placeholder name &num;IMPLIED &gt;
&lt;!ATTLIST separator name &num;IMPLIED &gt;
&lt;!ATTLIST menu name &num;IMPLIED &lt;!ATTLIST menu name &num;IMPLIED
action &num;REQUIRED action &num;REQUIRED
position (top|bot) &num;IMPLIED &gt; position (top|bot) &num;IMPLIED &gt;
@ -126,7 +127,7 @@ The most remarkable feature of #GtkUIManager is that it can overlay a set
of menuitems and toolitems over another one, and demerge them later. of menuitems and toolitems over another one, and demerge them later.
</para> </para>
<para> <para>
Merging is done based on the name of the XML elements. Each element is Merging is done based on the names of the XML elements. Each element is
identified by a path which consists of the names of its anchestors, separated identified by a path which consists of the names of its anchestors, separated
by slashes. For example, the menuitem named "Left" in the example above by slashes. For example, the menuitem named "Left" in the example above
has the path <literal>/ui/menubar/JustifyMenu/Left</literal> and the has the path <literal>/ui/menubar/JustifyMenu/Left</literal> and the

View File

@ -824,7 +824,8 @@ get_child_node (GtkUIManager *self,
{ {
for (child = parent->children; child != NULL; child = child->next) for (child = parent->children; child != NULL; child = child->next)
{ {
if (strlen (NODE_INFO (child)->name) == childname_length && if (NODE_INFO (child)->name &&
strlen (NODE_INFO (child)->name) == childname_length &&
!strncmp (NODE_INFO (child)->name, childname, childname_length)) !strncmp (NODE_INFO (child)->name, childname, childname_length))
{ {
/* if undecided about node type, set it */ /* if undecided about node type, set it */
@ -1215,15 +1216,24 @@ start_element_handler (GMarkupParseContext *context,
!strcmp (element_name, "separator")) !strcmp (element_name, "separator"))
{ {
GNode *node; GNode *node;
gint length;
if (ctx->state == STATE_TOOLBAR) if (ctx->state == STATE_TOOLBAR)
ctx->state = STATE_TOOLITEM; ctx->state = STATE_TOOLITEM;
else else
ctx->state = STATE_MENUITEM; ctx->state = STATE_MENUITEM;
if (!strcmp (node_name, "separator"))
{
node_name = NULL;
length = -1;
}
else
length = strlen (node_name);
node = get_child_node (self, ctx->current, node = get_child_node (self, ctx->current,
node_name, strlen (node_name), node_name, length,
NODE_TYPE_SEPARATOR, NODE_TYPE_SEPARATOR,
TRUE, top); TRUE, top);
if (NODE_INFO (node)->action_name == 0) if (NODE_INFO (node)->action_name == 0)
NODE_INFO (node)->action_name = action_quark; NODE_INFO (node)->action_name = action_quark;