Hi Alastair, I have added JIRAs for all of these Issues. Thanks a lot for your issues.
Regards lahiru On Thu, 2008-01-03 at 10:53 -0800, Alastair FETTES wrote: > Apache Axis2/C Team: > > During our work with Axis2/C version 1.1 we have run into a number of > issues that we would like to convey back to this group. The main > problem that we have found is a lack of documentation regarding > ownership of memory in input parameters and return parameters. Here > is the laundry list of items so far. > > 1. Function axis2_svc_client_remove_all_headers: > > <snippet> > 98 for (i = 0; i < size; i++) > 99 { > 100 /*axiom_node_t *node = NULL; > 101 node = axutil_array_list_get(svc_client->headers, > env,i); > 102 > 103 if (node) > 104 { > 105 axiom_node_free_tree(node, env); > 106 node = NULL; > 107 } */ > 108 axutil_array_list_remove(svc_client->headers, env, i); > 109 } > > > 110 AXIS2_EXTERN void *AXIS2_CALL > 111 axutil_array_list_remove( > 112 struct axutil_array_list *array_list, > 113 const axutil_env_t * env, > 114 int index) > 115 { > 116 void *result = NULL; > 117 int i = 0; > 118 AXIS2_PARAM_CHECK (env->error, array_list, AXIS2_FAILURE); > 119 > 120 if (axutil_array_list_check_bound_exclusive(array_list, env, > index)) > 121 { > 122 result = array_list->data[index]; > 123 for (i = index; i < array_list->size - 1; i++) > 124 array_list->data[i] = array_list->data[i + 1]; > 125 array_list->size--; > 126 } > 127 > 128 return result; > 129 } > </snippet> > > Problem: There is a possible bug in > "axis2_svc_client_remove_all_headers" function. The call to > "axutil_array_list_remove" (line 108) is where the problem stems from. > Since the for-loop (line 98) is incrementing, and the value of > "array_list->size" (line 125) is decrementing, eventually line 120 > will fail, and some of the headers will not be cleared out. > > Solution: The call to axutil_array_list_remove should be decrementing > (line 108 is a possible solution): > > <snippet> > 98 for (i = 0; i < size; i--) > 99 { > 100 /*axiom_node_t *node = NULL; > 101 node = axutil_array_list_get(svc_client->headers, > env,i); > 102 > 103 if (node) > 104 { > 105 axiom_node_free_tree(node, env); > 106 node = NULL; > 107 } */ > 108 axutil_array_list_remove(svc_client->headers, env, (size - > i) - 1); > 109 } > </snippet> > > 2. Function axiom_element_create. > > <snippet> > AXIS2_EXTERN > axiom_element_t* axiom_element_create( > const axutil_env_t* env, > axiom_node_t* parent, > const axis2_char_t* localname, > axiom_namespace_t* ns, > axiom_node_t** node) > </snippet> > > Problem: The axiom_node_t instance node has responsibility for the > returned axion_element_t*. Therefore, calls to axiom_node_free_tree > will free this returned element (in addition to all the child nodes of > node). The memory allocated for the return value should not be > de-allocated using axiom_element_free in this scenario, since it is > internally tied to the node. > > Solution: Document memory ownership for parameters and return value. > > 3. Function axiom_element_set_text: > > <snippet> > AXIS2_EXTERN > axis2_status_t axiom_element_set_text( > axiom_element_t* om_element, > const axutil_env_t* env, > const axis2_char_t* text, > axiom_node_t* element_node) > </snippet> > > Problem: Currently, the om_element has no use and is not used by the > function axiom_element_set_text therefore could probably be set NULL. > The function does not take control of the string text within text. > > Solution: Document memory ownership for parameters and return value. > > 4. Function axiom_xml_reader_create_for_memory > > <snippet> > AXIS2_EXTERN > axiom_xml_reader_t* axiom_xml_reader_create_for_memory( > const axutil_env_t* env, > void* container, > int size, > const axis2_char_t* encoding, > int type) > </snippet> > > Problem: The return value of type axiom_xml_reader_t* takes control of > the data contained within container. > > Solution: Document memory ownership for parameters and return value. > > 5. Function axiom_stax_builder_create > > <snippet> > AXIS2_EXTERN > axiom_stax_builder_t* axiom_stax_builder_create( > const axutil_env_t* env, > axiom_xml_reader_t* parser) > </snippet> > > Problem: The return value of type axiom_stax_t* takes responsibility > for the memory allocated for parser. > > Solution: Document memory ownership for parameters and return value. > > 6. Function axiom_document_create: > > <snippet> > AXIS2_EXTERN > axiom_document_t* axiom_document_create( > const axutil_env_t* env, > axiom_node_t* root, > axiom_stax_builder_t* builder) > </snippet> > > Problem: The return value of type axiom_document_t* takes > responsibility for the memory allocated for root. Any child node that > is added to root will be free-ed when the function axiom_document_free > is called. The return value of type axiom_document_t* does not takes > responsibility for the memory allocated for builder (as of v1.1.0, > this seems odd, since the internal structure maintains a pointer to > builder, but does not free builder. So this may create a dangling > pointer situation). > > Solution: Document memory ownership for parameters and return value. > Investigate use of pointers in internal structure. > > 7. Function axiom_document_build_all: > > <snippet> > AXIS2_EXTERN > axiom_node_t* axiom_document_build_all( > struct axiom_document* document, > const axutil_env_t* env) > </snippet> > > Problem: The caller of this function is not given responsibility for > the return value of type axiom_node_t*, since (as of v1.1.0) the > return value is free-ed by the function axiom_document_free. If the > caller calls the function axiom_document_free_self, the return value > is NOT free-ed. So a memory leak is possible here. > > Solution: Document memory ownership for parameters and return value. > Investigate the use of free functions and pointers in regards to > possible memory leak. > > 8. Function axiom_namespace_create: > > <snippet> > AXIS2_EXTERN > axiom_namespace_t* axiom_namespace_create( > const axutil_env_t* env, > const axis2_char_t* uri, > const axis2_char_t* prefix) > </snippet> > > Problem: This function and return value of type axiom_namespace_t* > does not take responsibility for the memory allocated for the > parameters uri, prefix, and of course env. > > Solution: Document memory ownership for parameters and return value. > > 9. Function axiom_attribute_create: > > <snippet> > AXIS2_EXTERN > axiom_attribute_t* axiom_attribute_create( > const axutil_env_t* env, > const axis2_char_t* localname, > const axis2_char_t* value, > axiom_namespace_t* ns) > </snippet> > > Problem: This return value of type axiom_attribute_t* does not take > responsibility for the memory allocated for localname, value, ns, and > env. Although, if the return value is added to an axiom_node_t using > axiom_element_add_attribute, the responsibility of the namespace of > the attribute is given to the axiom_node_t. > > Solution: Document memory ownership for parameters and return value. > Investigate the ownership of the namespace parameter. > > 10. Function axiom_element_add_attribute: > > <snippet> > AXIS2_EXTERN > axis2_status_t axiom_element_add_attribute( > axiom_element_t* om_element, > const axutil_env_t* env, > axiom_attribute_t* attribute, > axiom_node_t* element_node) > </snippet> > > Problem: The parameter om_element takes responsibility for the memory > allocated for the parameter attribute, thus a call to > axiom_element_free will de-allocated the data for attribute. The > parameter om_element also takes responsibility for the namespace > associated with attribute. > > Solution: Document memory ownership for parameters and return value. > > 11. Function axutil_env_create_all: > > <snippet> > AXIS2_EXTERN > axutil_env_t* axutil_env_create_all( > const axis2_char_t* log_file, > const axutil_log_levels_t log_level) > </snippet> > > Problem: This function does not take responsibility for the memory > allocated by log_file. > > Solution: Document memory ownership for parameters and return value. > > 12. Function axiom_output_create: > > <snippet> > AXIS2_EXTERN > axiom_output_t* axiom_output_create( > const axutil_env_t* env, > axiom_xml_writer_t* xml_writer) > </snippet> > > Problem: The return value of type axiom_output_t* takes responsibility > for the memory allocated to the parameter xml_writer. > > Solution: Document memory ownership for parameters and return value. > > 13. Function axis2_svc_client_send_receive_non_blocking: > > <snippet> > AXIS2_EXTERN > void axis2_svc_client_send_receive_non_blocking( > axis2_svc_client_t* svc_client, > const axutil_env_t* env, > const axiom_node_t* payload, > axis2_callback_t* callback) > </snippet> > > Problem: This function takes responsibility for the memory allocated > for the parameter payload (assumed due to access violations for > free-ing), as well as the custom headers that have been added to the > parameter svc_client (again, assumed because of access violations on > free-ing). This function also takes responsibility for the memory > allocated at callback, through the following call tree: > > axis2_svc_client_send_receive_non_blocking > axis2_svc_client_send_receive_non_blocking_with_op_qname > axis2_op_client_set_callback > > The memory is free-ed with a call to axis2_op_client_free (it is > assumed that someone calls this) > > Solution: Document memory ownership for parameters and return value. > > 14. Function axis2_svc_client_add_header: > > <snippet> > AXIS2_EXTERN > axis2_status_t axis2_svc_client_add_header( > axis2_svc_client_t* svc_client, > const axutil_env_t* env, > axiom_node_t* header) > </snippet> > > The parameter svc_client does not take responsibility for the memory > allocated for header, although it does maintain an internal pointer to > the data. This can result in dangling pointer situations if the caller > deletes the memory passed using header before svc_client has a chance > to remove the header. > > Solution: Document memory ownership for parameters and return value. > Investigate the use of pointers in the internal structure to avoid > dangling pointer situations. > > 15. Function axis2_svc_client_remove_all_headers: > > <snippet> > AXIS2_EXTERN > axis2_status_t axis2_svc_client_remove_all_headers( > axis2_svc_client_t* svc_client, > const axutil_env_t* env) > </snippet> > > This function does not take responsibility for the memory allocated to > the pointers passed to it. In addition, the memory passed to the > function axis2_svc_client_add_header through the parameter header is > not de-allocated by this function > (axis2_svc_client_remove_all_headers). This can create a possible > memory leak. When in used in conjunction with a call to > axis2_svc_client_send_receive_non_blocking, this is not a problem as > this function will clean up the headers itself (this is assumed, since > when you free the header nodes, an access violations occur when the > SOAP message is sent and the calling function tries to free the SOAP > message data, i.e. the header nodes). > > Solution: Document memory ownership for parameters and return value. > Investigate potential memory leak. > > <end/> > > Thanks very much for your time and efforts. > > Alastair Fettes > > This e-mail and any attachments are intended solely for the use of the > intended recipient(s) and may contain legally privileged, proprietary > and/or confidential information. Any use, disclosure, dissemination, > distribution or copying of this e-mail and any attachments for any > purposes that have not been specifically authorized by the sender is > strictly prohibited. If you are not the intended recipient, please > immediately notify the sender by reply e-mail and permanently delete > all copies and attachments. > > The entire content of this e-mail is for "information purposes" only > and should not be relied upon by the recipient in any way unless > otherwise confirmed in writing by way of letter or facsimile. > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]