Hi group,
I guess I found a problem in generated sources. I try to get in touch with
Axis and play around with all the things... I have a service that returns
an array of structures that contain all possible datatypes - also float
and double.
I used this class for generating the wsdl:
public class Dat{
public long l;
public short s;
public int i;
public String str;
public float fl;
public double dl;
}
The generated wsdl shows
<xs:element name="Dat" type="ns:Dat" />
<xs:complexType name="Dat">
<xs:sequence>
<xs:element name="dl" type="xs:double" />
<xs:element name="fl" type="xs:float" />
<xs:element name="i" type="xs:int" />
<xs:element name="str" nillable="true" type="xs:string" />
<xs:element name="l" type="xs:long" />
<xs:element name="s" type="xs:short" />
</xs:sequence>
</xs:complexType>
When you generate C-Server stubs the constructor function
shows:
AXIS2_EXTERN axis2_Dat_t* AXIS2_CALL
axis2_Dat_create(
const axutil_env_t *env )
{
axis2_Dat_t *Dat = NULL;
AXIS2_ENV_CHECK(env, NULL);
Dat = (axis2_Dat_t *) AXIS2_MALLOC(env->
allocator, sizeof(axis2_Dat_t));
/* **** missing
* memset( Dat, 0, sizeof(axis2_Dat_t));
* *****
*/
if(NULL == Dat)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
return Dat;
}
For more safety it would be desirable if the generation would add the
memset() call. I did not initialize every field of the structure before
returning it and the service crashed (with the server), when it tried to
return the values. In that the generated function axis2_Date_serialize()
is called. This function has a problem, as it tries to print (with
sprintf()) all the numeric members of the Dat-struct into 64-bytes memory
blocks. Printing a double with sprintf() this way into a 64-byte array
will most likely crash, especially with uninitialized memory, as the
resulting string will be longer than 64 bytes.
Unfortunately the user cannot call the memset himself after calling the
constructor as the real length of the type is hidden in the module. I
myself now know that I have to call the setter method for each member of a
new struct.
Thanks,
Flori.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]