Correct security (de)serialization of QosProperty contained in c.data field of handshake token

Signed-off-by: Marcel Jordense <marcel.jordense@adlinktech.com>
This commit is contained in:
Marcel Jordense 2020-05-01 10:58:07 +02:00 committed by eboasson
parent 623a5c02bd
commit 720c8f8fbf

View file

@ -396,6 +396,7 @@ DDS_Security_Serialize_PropertyQosPolicy(
DDS_Security_Serialize_uint16(ser, PID_PROPERTY_LIST); DDS_Security_Serialize_uint16(ser, PID_PROPERTY_LIST);
DDS_Security_Serialize_mark_len(ser); DDS_Security_Serialize_mark_len(ser);
DDS_Security_Serialize_PropertySeq(ser, &policy->value); DDS_Security_Serialize_PropertySeq(ser, &policy->value);
if (policy->binary_value._length > 0)
DDS_Security_Serialize_BinaryPropertySeq(ser, &policy->binary_value); DDS_Security_Serialize_BinaryPropertySeq(ser, &policy->binary_value);
DDS_Security_Serialize_update_len(ser); DDS_Security_Serialize_update_len(ser);
} }
@ -679,10 +680,18 @@ DDS_Security_Deserialize_DataHolder(
static int static int
DDS_Security_Deserialize_PropertyQosPolicy( DDS_Security_Deserialize_PropertyQosPolicy(
DDS_Security_Deserializer dser, DDS_Security_Deserializer dser,
DDS_Security_PropertyQosPolicy *policy) DDS_Security_PropertyQosPolicy *policy,
size_t len)
{ {
return DDS_Security_Deserialize_PropertySeq(dser, &policy->value) && size_t sl = dser->remain;
DDS_Security_Deserialize_BinaryPropertySeq(dser, &policy->binary_value);
if (!DDS_Security_Deserialize_PropertySeq(dser, &policy->value))
return 0;
if (sl - dser->remain > len)
return DDS_Security_Deserialize_BinaryPropertySeq(dser, &policy->binary_value);
return 1;
} }
static int static int
@ -742,7 +751,7 @@ DDS_Security_Deserialize_ParticipantBuiltinTopicData(
r = DDS_Security_Deserialize_DataHolder(dser, &pdata->permissions_token); r = DDS_Security_Deserialize_DataHolder(dser, &pdata->permissions_token);
break; break;
case PID_PROPERTY_LIST: case PID_PROPERTY_LIST:
r = DDS_Security_Deserialize_PropertyQosPolicy(dser, &pdata->property); r = DDS_Security_Deserialize_PropertyQosPolicy(dser, &pdata->property, len);
break; break;
case PID_PARTICIPANT_SECURITY_INFO: case PID_PARTICIPANT_SECURITY_INFO:
r = DDS_Security_Deserialize_ParticipantSecurityInfo(dser, &pdata->security_info); r = DDS_Security_Deserialize_ParticipantSecurityInfo(dser, &pdata->security_info);