Protect PVUnion selector in deserialize

This commit is contained in:
Andrew Johnson authored and Michael Davidsaver committed 2026-08-09 18:26:52 -07:00
1 parent 2c5854a7ec
commit e7c69cb5d2
1 file changed
+12 -7
+12 -7
View File
@@ -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();
}
}