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]

Reply via email to