axis-c-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Mitchell (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AXIS2C-783) Client seg faults if AXIS2C_HOME variable not set
Date Tue, 27 Nov 2007 22:28:43 GMT

    [ https://issues.apache.org/jira/browse/AXIS2C-783?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12546030
] 

Bill Mitchell commented on AXIS2C-783:
--------------------------------------

I have verified the change (5) in the templates.  The WSDL2C from the build of 11/27/07 does
detect that the service was not created and so does not populate the non-existent service.
 

The difficulty I had verifying this yesterday resulted from a behavior I did not expect from
WSDL2C.  If the .h and .c files already exist in the target directory, WSDL2C stops with no
error message and without modifying the files.  When I delete the files before running WSDL2C,
the new files represent the new templates.  

So, all done, thanks,
Bill

> Client seg faults if AXIS2C_HOME variable not set
> -------------------------------------------------
>
>                 Key: AXIS2C-783
>                 URL: https://issues.apache.org/jira/browse/AXIS2C-783
>             Project: Axis2-C
>          Issue Type: Bug
>          Components: code generation, core/clientapi, core/deployment
>    Affects Versions: 1.1.0
>         Environment: Window XP, Visual Studio 2005
>            Reporter: Bill Mitchell
>            Assignee: Dinesh Premalal
>             Fix For: 1.2.0
>
>
> If the AXIS2C_HOME variable is not set, or if the client application code sets the ClientHome
argument to a directory that does not containt axis2.xml and related files, the client application
fails with a segmentation fault.  Investigating this uncovered several issues, best described
by highlighting the relevant actions in the code in chronological order:
> (1) axis2_dep_engine_check_client_home() in depengine.c detects the problem and stores
an error code, AXIS2_ERROR_CONFIG_NOT_FOUND (18).  But processing at this point is allowed
to continue. 
> (2) axis2_conf_builder_create_with_file_and_dep_engine_and_conf(), in particular axis2_desc_builder_create_with_file_and_dep_engine(),
then changes the status_code in the environment error  structure back to success.  This is
a side-effect of invoking the AXIS2_PARM_CHECK macro.  
> (3) In axis2_desc_builder_build_om(), the call to axiom_xml_reader_create_for_file()
returns an error, but the error number has now been replaced 
> with AXIS2_ERROR_CREATING_XML_STREAM_READER(141).  Axis2_desc_builder_build_om() then
replaces this error number with the same value, just to 
> make sure it is well and truly changed.  
> (4) In stub.c, axis2_stub_create_with_endpoint_ref_and_client_home() replaces the error
141 with a truly misleading AXIS2_ERROR_NO_MEMORY(2).  
> (5) In the generated stub code to create the service, axis2_stub_servicename_create()
ignores the fact that the returned stub pointer is zero and goes ahead and calls axis2_stub_servicename_populate_services()
anyway, where the code dies dereferencing the zero pointer.  
> Recommendations:
> (5) In the generated stub code for axis2_stub_servicename_create(), the fragment 
>     stub = axis2_stub_create_with_endpoint_ref_and_client_home ( env, endpoint_ref, client_home
);
>     axis2_stub_servicename_populate_services( stub, env );
>     return stub;
> should read:
>     stub = axis2_stub_create_with_endpoint_ref_and_client_home ( env, endpoint_ref, client_home
);
>     if (stub) 
>     {
>         axis2_stub_servicename_populate_services( stub, env );
>     }
>     return stub;
> (4) In stub.c, the procedure axis2_stub_create_with_endpoint_ref_and_client_home() really
needs to let the underlying error number be returned.  In the fragment:
>     /* create service_client*/
>     stub->svc_client = axis2_svc_client_create(env , client_home);
>     if (!stub->svc_client)
>     {
>         axis2_stub_free(stub, env);
>         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
>         return NULL;
>     }
> the AXIS2_ERROR_SET invocation should be removed.  
> (1) Where the client has passed a clienthome parameter, but it does not point to a valid
Axis2C home directory structure, I prefer the first error code AXIS2_ERROR_CONFIG_NOT_FOUND
to the second AXIS2_ERROR_CREATING_XML_STREAM_READER.  So I suggest that axis2_dep_engine_load_client()
in depengine.c be changed to treat this as an immediate error instead of letting processing
continue.  The fragment:
>     if (client_home && 0 != axutil_strcmp("", client_home))
>     {
>         status = axis2_dep_engine_check_client_home(dep_engine, env, client_home);
>         if (AXIS2_SUCCESS == status)
>         {
>             is_repos_exist = AXIS2_TRUE;
>         }
>     }
>     else
> could be changed to:
>     if (client_home && 0 != axutil_strcmp("", client_home))
>     {
>         status = axis2_dep_engine_check_client_home(dep_engine, env, client_home);
>         if (AXIS2_SUCCESS != status)
>         {
>             return NULL;
>         }
>         is_repos_exist = AXIS2_TRUE;
>     }
>     else
> Of course, there may be a good reason to want to continue processing that I have not
uncovered.  In this case, you could instead do something to resolve item(2), such that the
original error code could be returned instead of overlaying it as happens at point (3).  

-- 
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: axis-c-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-c-dev-help@ws.apache.org


Mime
View raw message