Common WWSAPI errors: property value set incorrectly


As mentioned in my previous post, WWSAPI follows a common pattern to set properties (which in most cases are just configuration settings). Each property structure consists of three fields: id, value and valueSize. The field id is an enum value of the property. The enum value has a corresponding type whose size should be set in the field valueSize. The value field is defined as void* and should always be a pointer to the actual type of the property. A common mistake is to assign the actual type to the value field. The result of that is typically Access Violation that brings down the process.


 


For example, WS_XML_SECURITY_TOKEN_PROPERTY is defined this way:


typedef struct _WS_XML_SECURITY_TOKEN_PROPERTY {


    WS_XML_SECURITY_TOKEN_PROPERTY_ID id;


    __field_bcount(valueSize) void* value;


    ULONG valueSize;


} WS_XML_SECURITY_TOKEN_PROPERTY;


 


The WS_XML_SECURITY_TOKEN_PROPERTY_ID enum contains a value WS_XML_SECURITY_TOKEN_PROPERTY_ATTACHED_REFERENCE with a corresponding type WS_XML_BUFFER*. The correct way to use this property is:


WS_XML_SECURITY_TOKEN_PROPERTY tokenProperty[1];


WS_XML_BUFFER* buffer = GetAttachedReference();


tokenProperty[0].id = WS_XML_SECURITY_TOKEN_PROPERTY_ATTACHED_REFERENCE;


tokenProperty[0].value = &buffer;


tokenProperty[0].valueSize = sizeof(buffer);


 


Assigning buffer to tokenProperty[0].value will not give you a compiler error, but will probably lead to AV when you run the program. If the property type is a non-pointer type (BOOL, ULONG, WS_DATETIME, etc), the compiler will catch the error if the value is directly assigned, but the error is less obvious when the type is a pointer type.

Comments (0)