Skip to content

Commit

Permalink
DynamicTablesPkg/TableHelperLib: Enhance error handling
Browse files Browse the repository at this point in the history
This patch enhances error handling and reporting in the CM ObjectParser.
Specifically:
1. ObjectIDs used as array indexes are checked for being out of bounds,
   and if so an error message is printed before the assert.
2. An error message is printed for unsupported NameSpaceIDs.
3. Adds support for unimplemented parsers by allowing IDs to list a
   NULL parser, resulting in an unimplemented message being printed.

Signed-off-by: Jeshua Smith <[email protected]>
Reviewed-by: Pierre Gondois <[email protected]>
Reviewed-by: Sami Mujawar <[email protected]>
  • Loading branch information
jeshuasmith authored and mergify[bot] committed Oct 23, 2023
1 parent 575bd4f commit ec7f734
Showing 1 changed file with 33 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -795,6 +795,7 @@ STATIC CONST CM_OBJ_PARSER_ARRAY StdNamespaceObjectParser[] = {
ARRAY_SIZE (StdObjAcpiTableInfoParser) },
{ "EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser,
ARRAY_SIZE (StdObjSmbiosTableInfoParser) },
{ "EStdObjMax", NULL, 0}
};

/** Print string data.
Expand Down Expand Up @@ -1066,6 +1067,12 @@ ParseCmObjDesc (
return;
}

if (ObjId >= ARRAY_SIZE (StdNamespaceObjectParser)) {
DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the StdNamespaceObjectParser array\n", ObjId));
ASSERT (0);
return;
}

ParserArray = &StdNamespaceObjectParser[ObjId];
break;
case EObjNameSpaceArm:
Expand All @@ -1074,10 +1081,17 @@ ParseCmObjDesc (
return;
}

if (ObjId >= ARRAY_SIZE (ArmNamespaceObjectParser)) {
DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the ArmNamespaceObjectParser array\n", ObjId));
ASSERT (0);
return;
}

ParserArray = &ArmNamespaceObjectParser[ObjId];
break;
default:
// Not supported
DEBUG ((DEBUG_ERROR, "NameSpaceId 0x%x, ObjId 0x%x is not supported by the parser\n", NameSpaceId, ObjId));
ASSERT (0);
return;
} // switch
Expand All @@ -1095,21 +1109,26 @@ ParseCmObjDesc (
ObjIndex + 1,
ObjectCount
));
PrintCmObjDesc (
(VOID *)((UINTN)CmObjDesc->Data + Offset),
ParserArray->Parser,
ParserArray->ItemCount,
&RemainingSize,
1
);
if ((RemainingSize > CmObjDesc->Size) ||
(RemainingSize < 0))
{
ASSERT (0);
return;
}
if (ParserArray->Parser == NULL) {
DEBUG ((DEBUG_ERROR, "Parser not implemented\n"));
RemainingSize = 0;
} else {
PrintCmObjDesc (
(VOID *)((UINTN)CmObjDesc->Data + Offset),
ParserArray->Parser,
ParserArray->ItemCount,
&RemainingSize,
1
);
if ((RemainingSize > CmObjDesc->Size) ||
(RemainingSize < 0))
{
ASSERT (0);
return;
}

Offset = CmObjDesc->Size - RemainingSize;
Offset = CmObjDesc->Size - RemainingSize;
}
} // for

ASSERT (RemainingSize == 0);
Expand Down

0 comments on commit ec7f734

Please sign in to comment.