Protect PVUnion selector in deserialize
This commit is contained in:
1 parent
2c5854a7ec
commit
e7c69cb5d2
1 file changed
+12
-7
+12
-7
@@ -161,21 +161,26 @@ void PVUnion::deserialize(ByteBuffer *pbuffer, DeserializableControl *pcontrol)
|
||||
}
|
||||
else
|
||||
{
|
||||
int32 previousSelector = selector;
|
||||
selector = static_cast<int32>(SerializeHelper::readSize(pbuffer, pcontrol));
|
||||
if (selector != UNDEFINED_INDEX)
|
||||
int32 index = static_cast<int32>(SerializeHelper::readSize(pbuffer, pcontrol));
|
||||
if (index == UNDEFINED_INDEX)
|
||||
{
|
||||
if (selector != previousSelector)
|
||||
selector = index;
|
||||
value.reset();
|
||||
}
|
||||
else if (index < 0 || size_t(index) >= unionPtr->getFields().size())
|
||||
throw std::runtime_error("union index out of bounds");
|
||||
else
|
||||
{
|
||||
if (selector != index)
|
||||
{
|
||||
FieldConstPtr field = unionPtr->getField(selector);
|
||||
selector = index;
|
||||
FieldConstPtr field = unionPtr->getField(index);
|
||||
// try to reuse existing field instance
|
||||
if (!value.get() || *value->getField() != *field)
|
||||
value = pvDataCreate->createPVField(field);
|
||||
}
|
||||
value->deserialize(pbuffer, pcontrol);
|
||||
}
|
||||
else
|
||||
value.reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user