Ticket #91 (new defect)
Opened 12 years ago
addMapToMap function
| Reported by: | Knut Landmark | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | |
| Component: | zoo-kernel | Version: | |
| Keywords: | Cc: |
Description
The addMapToMap(map** mo, map* mi) function (service.h) should append mi to the last node in mo. However, the function does not work as intended. In the following code fragment, the pointer _cursor is detached from the linked list mo when createMap is called. As a consequence, addMapToMap only modifies mo when *mo == NULL.
map* _cursor=*mo;
/* .... */
while(_cursor!=NULL)
_cursor=_cursor->next;
_cursor=createMap(tmp->name,tmp->value); // _cursor no longer points to node in mo linked list
_cursor->next=NULL; // superfluous
This problem affects, in the least, the support for PHP. See specifically the function map* php_map_from_HasTable(HashTable* t) (service_internal_php.c): The line
addMapToMap(&final_res, createMap(key,Z_STRVAL(tmpcopy)));
occurs inside a loop over the attributes of an output variable, but a node will only be added to final_res in the first iteration of the loop, i.e. only the first attribute will be included. Thus if the first attribute is not value, the WPS process fails.
I have written a modified addMapToMap function (see below) which resolved the problems with our PHP services (it should be verified independently that the modified function works as required).
static void addMapToMap( map** mo, map* mi ) {
if ( mo != NULL && mi != NULL ) {
map* p_mi = mi;
if ( *mo == NULL ) {
*mo = createMap( mi->name, mi->value );
p_mi = mi->next;
}
// move to end of *mo linked list
map* p_mo = *mo;
while ( p_mo->next != NULL ) { p_mo = p_mo->next; }
// add nodes in mi linked list sequentially
while ( p_mi != NULL ) {
p_mo->next = createMap( p_mi->name, p_mi->value );
p_mi = p_mi->next;
p_mo = p_mo->next;
}
}
}













