Skip to content

Commit

Permalink
SPMI: Fix repPrintObjectDescription and repGetStringLiteral (#77372)
Browse files Browse the repository at this point in the history
repPrintObjectDescription was not null-terminating when the map was
null. There is SPMI error trap on the JIT side so we can just make it
fail on missing data.

repGetStringLiteral should not succeed on missing data, it is used for
optimization purposes.
  • Loading branch information
jakobbotsch authored Oct 24, 2022
1 parent c092a76 commit 1c265ec
Showing 1 changed file with 25 additions and 49 deletions.
74 changes: 25 additions & 49 deletions src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4881,35 +4881,24 @@ void MethodContext::dmpGetStringLiteral(DLDD key, DD value)

int MethodContext::repGetStringLiteral(CORINFO_MODULE_HANDLE module, unsigned metaTOK, char16_t* buffer, int bufferSize)
{
if (GetStringLiteral == nullptr)
{
return -1;
}

DLDD key;
ZeroMemory(&key, sizeof(key)); // Zero key including any struct padding
key.A = CastHandle(module);
key.B = (DWORD)metaTOK;
key.C = (DWORD)bufferSize;

int itemIndex = GetStringLiteral->GetIndex(key);
if (itemIndex < 0)
{
return -1;
}
else
AssertMapAndKeyExist(GetStringLiteral, key, ": key handle-%016llX token-%X bufferSize-%d", key.A, key.B, key.C);

DD value = GetStringLiteral->Get(key);
DEBUG_REP(dmpGetStringLiteral(key, value));
int srcBufferLength = (int)value.A;
if (buffer != nullptr && srcBufferLength > 0)
{
DD value = GetStringLiteral->Get(key);
DEBUG_REP(dmpGetStringLiteral(key, value));
int srcBufferLength = (int)value.A;
if (buffer != nullptr && srcBufferLength > 0)
{
char16_t* srcBuffer = (char16_t*)GetStringLiteral->GetBuffer(value.B);
Assert(srcBuffer != nullptr);
memcpy(buffer, srcBuffer, min(srcBufferLength, bufferSize) * sizeof(char16_t));
}
return srcBufferLength;
char16_t* srcBuffer = (char16_t*)GetStringLiteral->GetBuffer(value.B);
Assert(srcBuffer != nullptr);
memcpy(buffer, srcBuffer, min(srcBufferLength, bufferSize) * sizeof(char16_t));
}
return srcBufferLength;
}

void MethodContext::recPrintObjectDescription(void* handle, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize, size_t bytesWritten)
Expand Down Expand Up @@ -4943,44 +4932,31 @@ void MethodContext::dmpPrintObjectDescription(DLDL key, Agnostic_PrintObjectDesc
}
size_t MethodContext::repPrintObjectDescription(void* handle, char* buffer, size_t bufferSize, size_t* pRequiredBufferSize)
{
if (PrintObjectDescription == nullptr)
{
return 0;
}

DLDL key;
key.A = CastHandle(handle);
key.B = (DWORDLONG)bufferSize;

int itemIndex = PrintObjectDescription->GetIndex(key);
if (itemIndex < 0)
AssertMapAndKeyExist(PrintObjectDescription, key, ": key handle-%016llX bufferSize-%016llX", key.A, key.B);

Agnostic_PrintObjectDescriptionResult value = PrintObjectDescription->Get(key);
DEBUG_REP(dmpPrintObjectDescription(key, value));
if (pRequiredBufferSize != nullptr)
{
return 0;
*pRequiredBufferSize = (size_t)value.requiredBufferSize;
}
else
{
Agnostic_PrintObjectDescriptionResult value = PrintObjectDescription->Get(key);
DEBUG_REP(dmpPrintObjectDescription(key, value));
if (pRequiredBufferSize != nullptr)
{
*pRequiredBufferSize = (size_t)value.requiredBufferSize;
}

size_t bytesWritten = 0;

BYTE* srcBuffer = (BYTE*)PrintObjectDescription->GetBuffer(value.buffer);
Assert(srcBuffer != nullptr);
size_t bytesWritten = 0;

if (bufferSize > 0)
{
bytesWritten = min(bufferSize - 1, (size_t)value.bytesWritten);
memcpy(buffer, srcBuffer, bytesWritten);
BYTE* srcBuffer = (BYTE*)PrintObjectDescription->GetBuffer(value.buffer);
if (bufferSize > 0)
{
bytesWritten = min(bufferSize - 1, (size_t)value.bytesWritten);
memcpy(buffer, srcBuffer, bytesWritten);

// Always null-terminate
buffer[bytesWritten] = 0;
}
return bytesWritten;
// Always null-terminate
buffer[bytesWritten] = 0;
}
return bytesWritten;
}

void MethodContext::recGetHelperName(CorInfoHelpFunc funcNum, const char* result)
Expand Down

0 comments on commit 1c265ec

Please sign in to comment.