axiom_util_get_first_child_element_with_localname() returns wrong child_node if
a sibling is present and the first node does not match
--------------------------------------------------------------------------------------------------------------------------------------
Key: AXIS2C-1528
URL: https://issues.apache.org/jira/browse/AXIS2C-1528
Project: Axis2-C
Issue Type: Bug
Components: util
Affects Versions: 1.6.0
Environment: Linux
Reporter: Aleksey Mokhonko
Bug is obvious. I just show what to fix.
File: om_util.c
Routine: axiom_util_get_first_child_element_with_localname_attr()
Line: 830
Present:
if (om_attr_name && NULL != om_attr_value &&
axutil_strcmp(om_attr_name, attr_name) == 0
&& axutil_strcmp(om_attr_value,
attr_value) == 0)
{
*child_node = child; /*
<-------------------------------- !!!!!!!!!!!!!!!! */
return om_ele;
}
Must be:
if (om_attr_name && NULL != om_attr_value &&
axutil_strcmp(om_attr_name, attr_name) == 0
&& axutil_strcmp(om_attr_value,
attr_value) == 0)
{
*child_node = next_sibling; /*
<-------------------------------- !!!!!!!!!!!!!!!! */
return om_ele;
}
===============================================
More detailed:
===============================================
next_sibling = axiom_node_get_next_sibling(child, env);
while (next_sibling)
{
if (axiom_node_get_node_type(next_sibling, env) == AXIOM_ELEMENT)
{
om_ele =
(axiom_element_t *) axiom_node_get_data_element(next_sibling,
env);
if (om_ele)
{
child_localname = axiom_element_get_localname(om_ele, env);
if (child_localname &&
axutil_strcmp(child_localname, localname) == 0)
{
attr_ht = axiom_element_get_all_attributes(om_ele, env);
if (attr_ht)
{
for (hi = axutil_hash_first(attr_ht, env); hi;
hi = axutil_hash_next(env, hi))
{
void *val = NULL;
axutil_hash_this(hi, NULL, NULL, &val);
if (val)
{
om_attr = (axiom_attribute_t *) val;
om_attr_name =
axiom_attribute_get_localname(om_attr, env);
om_attr_value =
axiom_attribute_get_value(om_attr, env);
if (om_attr_name && NULL != om_attr_value &&
axutil_strcmp(om_attr_name, attr_name) == 0
&& axutil_strcmp(om_attr_value,
attr_value) == 0)
{
*child_node = next_sibling; /*
!!!!!!!!!!!!!!!! */ <-----------------------------------------
!!!!!!!!!!!!!!!!!!!!!!!!!
return om_ele;
}
om_attr = NULL;
om_attr_name = NULL;
om_attr_value = NULL;
}
}
}
}
}
om_ele = NULL;
child_localname = NULL;
}
next_sibling = axiom_node_get_next_sibling(next_sibling, env);
}
return NULL;
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]