Implemented better testing and fixed skipepd frames
This commit is contained in:
@@ -181,6 +181,12 @@ static void BuildCDBFromContainer(ReferenceContainer *container,
|
||||
}
|
||||
}
|
||||
|
||||
/* HI-8: Guard against double-patching (e.g. two DebugService instances).
|
||||
* Once the registry has been patched, subsequent PatchRegistry() calls are
|
||||
* no-ops. Original builders are not saved/restored — the debug wrappers
|
||||
* persist for the process lifetime (intentional for transparent debugging). */
|
||||
static bool registryPatched = false;
|
||||
|
||||
static void PatchItemInternal(const char8 *originalName,
|
||||
ObjectBuilder *debugBuilder) {
|
||||
ClassRegistryItem *item =
|
||||
@@ -215,6 +221,14 @@ DebugServiceBase::~DebugServiceBase() {
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
void DebugServiceBase::PatchRegistry() {
|
||||
/* HI-8: skip if already patched (prevents double-patch leak when multiple
|
||||
* DebugService instances are created). */
|
||||
if (registryPatched) {
|
||||
REPORT_ERROR_STATIC(ErrorManagement::Warning,
|
||||
"PatchRegistry: registry already patched — skipping (double-patch guard).");
|
||||
return;
|
||||
}
|
||||
registryPatched = true;
|
||||
PatchItemInternal("MemoryMapInputBroker",
|
||||
new DebugMemoryMapInputBrokerBuilder());
|
||||
PatchItemInternal("MemoryMapOutputBroker",
|
||||
@@ -305,13 +319,20 @@ void DebugServiceBase::ProcessSignal(DebugSignalInfo *signalInfo, uint32 size,
|
||||
return;
|
||||
if (signalInfo->isForcing) {
|
||||
uint32 nEl = signalInfo->numberOfElements;
|
||||
/* HI-4: clamp size to forcedValue buffer to prevent OOB read */
|
||||
uint32 forceSize = size;
|
||||
if (forceSize > static_cast<uint32>(sizeof(signalInfo->forcedValue))) {
|
||||
forceSize = static_cast<uint32>(sizeof(signalInfo->forcedValue));
|
||||
}
|
||||
if (nEl <= 1u) {
|
||||
// Scalar — single memcpy.
|
||||
memcpy(signalInfo->memoryAddress, signalInfo->forcedValue, size);
|
||||
// Scalar — single memcpy (clamped to forcedValue bounds).
|
||||
memcpy(signalInfo->memoryAddress, signalInfo->forcedValue, forceSize);
|
||||
} else {
|
||||
// Array — copy only the elements whose bit is set in forcedMask.
|
||||
uint32 elemBytes = size / nEl;
|
||||
for (uint32 e = 0u; e < nEl; e++) {
|
||||
// HI-4: cap loop at 256 elements (forcedMask is 32 bytes = 256 bits).
|
||||
uint32 elemBytes = forceSize / nEl;
|
||||
uint32 nElCapped = (nEl > 256u) ? 256u : nEl;
|
||||
for (uint32 e = 0u; e < nElCapped; e++) {
|
||||
if (signalInfo->forcedMask[e >> 3u] & (uint8)(1u << (e & 7u))) {
|
||||
memcpy((uint8 *)signalInfo->memoryAddress + e * elemBytes,
|
||||
signalInfo->forcedValue + e * elemBytes,
|
||||
|
||||
Reference in New Issue
Block a user