Skip to content

Commit 2104be5

Browse files
committed
Use rb_ensure in namespaces.each to free nsList on exception.
1 parent 263cff6 commit 2104be5

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

ext/libxml/ruby_xml_namespaces.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,31 @@ static VALUE rxml_namespaces_definitions(VALUE self)
116116
* ..
117117
* end
118118
*/
119+
static VALUE rxml_namespaces_each_yield(VALUE data)
120+
{
121+
xmlNsPtr*nsList = (xmlNsPtr*)data;
122+
xmlNsPtr*xns;
123+
124+
for (xns = nsList; *xns != NULL; xns++)
125+
{
126+
VALUE ns = rxml_namespace_wrap(*xns);
127+
rb_yield(ns);
128+
}
129+
130+
return Qnil;
131+
}
132+
133+
static VALUE rxml_namespaces_free_list(VALUE data)
134+
{
135+
xmlNsPtr*nsList = (xmlNsPtr*)data;
136+
xmlFree(nsList);
137+
return Qnil;
138+
}
139+
119140
static VALUE rxml_namespaces_each(VALUE self)
120141
{
121142
xmlNodePtr xnode;
122-
xmlNsPtr *nsList, *xns;
143+
xmlNsPtr*nsList;
123144

124145
TypedData_Get_Struct(self, xmlNode, &rxml_namespaces_type, xnode);
125146

@@ -128,12 +149,8 @@ static VALUE rxml_namespaces_each(VALUE self)
128149
if (nsList == NULL)
129150
return (Qnil);
130151

131-
for (xns = nsList; *xns != NULL; xns++)
132-
{
133-
VALUE ns = rxml_namespace_wrap(*xns);
134-
rb_yield(ns);
135-
}
136-
xmlFree(nsList);
152+
rb_ensure(rxml_namespaces_each_yield, (VALUE)nsList,
153+
rxml_namespaces_free_list, (VALUE)nsList);
137154

138155
return Qnil;
139156
}

0 commit comments

Comments
 (0)