Skip to content

Commit 06cf587

Browse files
committed
Defensive code fix to prevent out of bounds memory during DXIL debugging
GetElementPtr and UpdateMemoryVariableFromBackingMemory
1 parent 3bafceb commit 06cf587

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

renderdoc/driver/shaders/dxil/dxil_debug.cpp

+25-8
Original file line numberDiff line numberDiff line change
@@ -4258,12 +4258,23 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper,
42584258

42594259
result.type = baseType;
42604260
result.rows = (uint8_t)countElems;
4261-
backingMemory += offset;
4262-
m_Memory.m_AllocPointers[resultId] = {ptrId, backingMemory, size};
42634261

42644262
RDCASSERT(offset + size <= alloc.size);
4265-
RDCASSERT(size < sizeof(result.value.f32v));
4266-
memcpy(&result.value.f32v[0], backingMemory, size);
4263+
if(offset + size <= alloc.size)
4264+
{
4265+
backingMemory += offset;
4266+
m_Memory.m_AllocPointers[resultId] = {ptrId, backingMemory, size};
4267+
4268+
RDCASSERT(size < sizeof(result.value.f32v));
4269+
if(size < sizeof(ShaderValue))
4270+
memcpy(&result.value, backingMemory, size);
4271+
else
4272+
RDCERR("Size %u too large MAX %u for GetElementPtr", size, sizeof(ShaderValue));
4273+
}
4274+
else
4275+
{
4276+
RDCERR("Invalid GEP offset %u size %u for alloc size %u", offset, size, alloc.size);
4277+
}
42674278
break;
42684279
}
42694280
case Operation::Bitcast:
@@ -5641,15 +5652,21 @@ void ThreadState::UpdateMemoryVariableFromBackingMemory(Id memoryId, const void
56415652
{
56425653
RDCASSERTEQUAL(baseMemory.rows, 1);
56435654
RDCASSERTEQUAL(baseMemory.columns, 1);
5644-
RDCASSERT(elementSize < sizeof(ShaderValue), elementSize);
5645-
memcpy(&baseMemory.value.f32v[0], src, elementSize);
5655+
if(elementSize < sizeof(ShaderValue))
5656+
memcpy(&baseMemory.value, src, elementSize);
5657+
else
5658+
RDCERR("Updating MemoryVariable elementSize %u too large max %u", elementSize,
5659+
sizeof(ShaderValue));
56465660
}
56475661
else
56485662
{
56495663
for(uint32_t i = 0; i < baseMemory.members.size(); ++i)
56505664
{
5651-
RDCASSERT(elementSize < sizeof(ShaderValue), elementSize);
5652-
memcpy(&baseMemory.members[i].value.f32v[0], src, elementSize);
5665+
if(elementSize < sizeof(ShaderValue))
5666+
memcpy(&baseMemory.members[i].value, src, elementSize);
5667+
else
5668+
RDCERR("Updating MemoryVariable member %u elementSize %u too large max %u", i, elementSize,
5669+
sizeof(ShaderValue));
56535670
src += elementSize;
56545671
}
56555672
}

0 commit comments

Comments
 (0)