// Value of stack element\r
//\r
typedef union {\r
- BOOLEAN Boolean;\r
- UINT32 Version;\r
+ BOOLEAN Boolean;\r
+ UINT32 Version;\r
} ELEMENT_VALUE;\r
\r
//\r
// Stack element used to evaluate dependency expressions\r
//\r
typedef struct {\r
- ELEMENT_VALUE Value;\r
- ELEMENT_TYPE Type;\r
+ ELEMENT_VALUE Value;\r
+ ELEMENT_TYPE Type;\r
} DEPEX_ELEMENT;\r
\r
//\r
**/\r
EFI_STATUS\r
Push (\r
- IN UINT32 Value,\r
- IN UINTN Type\r
+ IN UINT32 Value,\r
+ IN UINTN Type\r
)\r
{\r
- EFI_STATUS Status;\r
- DEPEX_ELEMENT Element;\r
+ EFI_STATUS Status;\r
+ DEPEX_ELEMENT Element;\r
\r
//\r
// Check Type\r
//\r
- if (Type != BooleanType && Type != VersionType) {\r
+ if ((Type != BooleanType) && (Type != VersionType)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
\r
Element.Value.Version = Value;\r
- Element.Type = Type;\r
+ Element.Type = Type;\r
\r
//\r
// Push the item onto the stack\r
DEBUG ((DEBUG_ERROR, "EvaluateDependency: Popped element type is mismatched!\n"));\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
OUT UINT32 *LastAttemptStatus OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT8 *Iterator;\r
- UINT8 Index;\r
- DEPEX_ELEMENT Element1;\r
- DEPEX_ELEMENT Element2;\r
- GUID ImageTypeId;\r
- UINT32 Version;\r
- UINT32 LocalLastAttemptStatus;\r
+ EFI_STATUS Status;\r
+ UINT8 *Iterator;\r
+ UINT8 Index;\r
+ DEPEX_ELEMENT Element1;\r
+ DEPEX_ELEMENT Element2;\r
+ GUID ImageTypeId;\r
+ UINT32 Version;\r
+ UINT32 LocalLastAttemptStatus;\r
\r
LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS;\r
\r
//\r
// Check if parameter is valid.\r
//\r
- if (Dependencies == NULL || DependenciesSize == 0) {\r
+ if ((Dependencies == NULL) || (DependenciesSize == 0)) {\r
return FALSE;\r
}\r
\r
- if (FmpVersions == NULL && FmpVersionsCount > 0) {\r
+ if ((FmpVersions == NULL) && (FmpVersionsCount > 0)) {\r
return FALSE;\r
}\r
\r
//\r
mDepexEvaluationStackPointer = mDepexEvaluationStack;\r
\r
- Iterator = (UINT8 *) Dependencies->Dependencies;\r
- while (Iterator < (UINT8 *) Dependencies->Dependencies + DependenciesSize) {\r
- switch (*Iterator)\r
- {\r
- case EFI_FMP_DEP_PUSH_GUID:\r
- if (Iterator + sizeof (EFI_GUID) >= (UINT8 *) Dependencies->Dependencies + DependenciesSize) {\r
- DEBUG ((DEBUG_ERROR, "EvaluateDependency: GUID extends beyond end of dependency expression!\n"));\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_GUID_BEYOND_DEPEX;\r
- goto Error;\r
- }\r
+ Iterator = (UINT8 *)Dependencies->Dependencies;\r
+ while (Iterator < (UINT8 *)Dependencies->Dependencies + DependenciesSize) {\r
+ switch (*Iterator) {\r
+ case EFI_FMP_DEP_PUSH_GUID:\r
+ if (Iterator + sizeof (EFI_GUID) >= (UINT8 *)Dependencies->Dependencies + DependenciesSize) {\r
+ DEBUG ((DEBUG_ERROR, "EvaluateDependency: GUID extends beyond end of dependency expression!\n"));\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_GUID_BEYOND_DEPEX;\r
+ goto Error;\r
+ }\r
+\r
+ CopyGuid (&ImageTypeId, (EFI_GUID *)(Iterator + 1));\r
+ Iterator = Iterator + sizeof (EFI_GUID);\r
\r
- CopyGuid (&ImageTypeId, (EFI_GUID *) (Iterator + 1));\r
- Iterator = Iterator + sizeof (EFI_GUID);\r
+ for (Index = 0; Index < FmpVersionsCount; Index++) {\r
+ if (CompareGuid (&FmpVersions[Index].ImageTypeId, &ImageTypeId)) {\r
+ Status = Push (FmpVersions[Index].Version, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
\r
- for (Index = 0; Index < FmpVersionsCount; Index ++) {\r
- if(CompareGuid (&FmpVersions[Index].ImageTypeId, &ImageTypeId)){\r
- Status = Push (FmpVersions[Index].Version, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
+ break;\r
}\r
- break;\r
}\r
- }\r
- if (Index == FmpVersionsCount) {\r
- DEBUG ((DEBUG_ERROR, "EvaluateDependency: %g is not found!\n", &ImageTypeId));\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_FMP_NOT_FOUND;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_PUSH_VERSION:\r
- if (Iterator + sizeof (UINT32) >= (UINT8 *) Dependencies->Dependencies + DependenciesSize ) {\r
- DEBUG ((DEBUG_ERROR, "EvaluateDependency: VERSION extends beyond end of dependency expression!\n"));\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_VERSION_BEYOND_DEPEX;\r
- goto Error;\r
- }\r
\r
- Version = *(UINT32 *) (Iterator + 1);\r
- Status = Push (Version, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- Iterator = Iterator + sizeof (UINT32);\r
- break;\r
- case EFI_FMP_DEP_VERSION_STR:\r
- Iterator += AsciiStrnLenS ((CHAR8 *) Iterator, DependenciesSize - (Iterator - Dependencies->Dependencies));\r
- if (Iterator == (UINT8 *) Dependencies->Dependencies + DependenciesSize) {\r
- DEBUG ((DEBUG_ERROR, "EvaluateDependency: STRING extends beyond end of dependency expression!\n"));\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_VERSION_STR_BEYOND_DEPEX;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_AND:\r
- Status = Pop (&Element1, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Push (Element1.Value.Boolean & Element2.Value.Boolean, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_OR:\r
- Status = Pop (&Element1, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop(&Element2, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Push (Element1.Value.Boolean | Element2.Value.Boolean, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_NOT:\r
- Status = Pop (&Element1, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Push (!(Element1.Value.Boolean), BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_TRUE:\r
- Status = Push (TRUE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_FALSE:\r
- Status = Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_EQ:\r
- Status = Pop (&Element1, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = (Element1.Value.Version == Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_GT:\r
- Status = Pop (&Element1, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = (Element1.Value.Version > Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_GTE:\r
- Status = Pop (&Element1, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = (Element1.Value.Version >= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_LT:\r
- Status = Pop (&Element1, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus= LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = (Element1.Value.Version < Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_LTE:\r
- Status = Pop (&Element1, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = Pop (&Element2, VersionType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
- goto Error;\r
- }\r
- Status = (Element1.Value.Version <= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
- goto Error;\r
- }\r
- break;\r
- case EFI_FMP_DEP_END:\r
- Status = Pop (&Element1, BooleanType);\r
- if (EFI_ERROR (Status)) {\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ if (Index == FmpVersionsCount) {\r
+ DEBUG ((DEBUG_ERROR, "EvaluateDependency: %g is not found!\n", &ImageTypeId));\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_FMP_NOT_FOUND;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_PUSH_VERSION:\r
+ if (Iterator + sizeof (UINT32) >= (UINT8 *)Dependencies->Dependencies + DependenciesSize ) {\r
+ DEBUG ((DEBUG_ERROR, "EvaluateDependency: VERSION extends beyond end of dependency expression!\n"));\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_VERSION_BEYOND_DEPEX;\r
+ goto Error;\r
+ }\r
+\r
+ Version = *(UINT32 *)(Iterator + 1);\r
+ Status = Push (Version, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Iterator = Iterator + sizeof (UINT32);\r
+ break;\r
+ case EFI_FMP_DEP_VERSION_STR:\r
+ Iterator += AsciiStrnLenS ((CHAR8 *)Iterator, DependenciesSize - (Iterator - Dependencies->Dependencies));\r
+ if (Iterator == (UINT8 *)Dependencies->Dependencies + DependenciesSize) {\r
+ DEBUG ((DEBUG_ERROR, "EvaluateDependency: STRING extends beyond end of dependency expression!\n"));\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_VERSION_STR_BEYOND_DEPEX;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_AND:\r
+ Status = Pop (&Element1, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Push (Element1.Value.Boolean & Element2.Value.Boolean, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_OR:\r
+ Status = Pop (&Element1, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Push (Element1.Value.Boolean | Element2.Value.Boolean, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_NOT:\r
+ Status = Pop (&Element1, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Push (!(Element1.Value.Boolean), BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_TRUE:\r
+ Status = Push (TRUE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_FALSE:\r
+ Status = Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_EQ:\r
+ Status = Pop (&Element1, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = (Element1.Value.Version == Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_GT:\r
+ Status = Pop (&Element1, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = (Element1.Value.Version > Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_GTE:\r
+ Status = Pop (&Element1, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = (Element1.Value.Version >= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_LT:\r
+ Status = Pop (&Element1, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = (Element1.Value.Version < Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_LTE:\r
+ Status = Pop (&Element1, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = Pop (&Element2, VersionType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ Status = (Element1.Value.Version <= Element2.Value.Version) ? Push (TRUE, BooleanType) : Push (FALSE, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_PUSH_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ break;\r
+ case EFI_FMP_DEP_END:\r
+ Status = Pop (&Element1, BooleanType);\r
+ if (EFI_ERROR (Status)) {\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_POP_FAILURE;\r
+ goto Error;\r
+ }\r
+\r
+ return Element1.Value.Boolean;\r
+ default:\r
+ DEBUG ((DEBUG_ERROR, "EvaluateDependency: Unknown Opcode - %02x!\n", *Iterator));\r
+ LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_UNKNOWN_OPCODE;\r
goto Error;\r
- }\r
- return Element1.Value.Boolean;\r
- default:\r
- DEBUG ((DEBUG_ERROR, "EvaluateDependency: Unknown Opcode - %02x!\n", *Iterator));\r
- LocalLastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_UNKNOWN_OPCODE;\r
- goto Error;\r
}\r
+\r
Iterator++;\r
}\r
\r
UINT8 *Depex;\r
\r
if (DepexSize != NULL) {\r
- *DepexSize = 0;\r
+ *DepexSize = 0;\r
}\r
\r
if (Dependencies == NULL) {\r
\r
Depex = Dependencies->Dependencies;\r
while (Depex < Dependencies->Dependencies + MaxDepexSize) {\r
- switch (*Depex)\r
- {\r
- case EFI_FMP_DEP_PUSH_GUID:\r
- Depex += sizeof (EFI_GUID) + 1;\r
- break;\r
- case EFI_FMP_DEP_PUSH_VERSION:\r
- Depex += sizeof (UINT32) + 1;\r
- break;\r
- case EFI_FMP_DEP_VERSION_STR:\r
- Depex += AsciiStrnLenS ((CHAR8 *) Depex, Dependencies->Dependencies + MaxDepexSize - Depex) + 1;\r
- break;\r
- case EFI_FMP_DEP_AND:\r
- case EFI_FMP_DEP_OR:\r
- case EFI_FMP_DEP_NOT:\r
- case EFI_FMP_DEP_TRUE:\r
- case EFI_FMP_DEP_FALSE:\r
- case EFI_FMP_DEP_EQ:\r
- case EFI_FMP_DEP_GT:\r
- case EFI_FMP_DEP_GTE:\r
- case EFI_FMP_DEP_LT:\r
- case EFI_FMP_DEP_LTE:\r
- Depex += 1;\r
- break;\r
- case EFI_FMP_DEP_END:\r
- Depex += 1;\r
- if (DepexSize != NULL) {\r
- *DepexSize = (UINT32)(Depex - Dependencies->Dependencies);\r
- }\r
- return TRUE;\r
- default:\r
- return FALSE;\r
+ switch (*Depex) {\r
+ case EFI_FMP_DEP_PUSH_GUID:\r
+ Depex += sizeof (EFI_GUID) + 1;\r
+ break;\r
+ case EFI_FMP_DEP_PUSH_VERSION:\r
+ Depex += sizeof (UINT32) + 1;\r
+ break;\r
+ case EFI_FMP_DEP_VERSION_STR:\r
+ Depex += AsciiStrnLenS ((CHAR8 *)Depex, Dependencies->Dependencies + MaxDepexSize - Depex) + 1;\r
+ break;\r
+ case EFI_FMP_DEP_AND:\r
+ case EFI_FMP_DEP_OR:\r
+ case EFI_FMP_DEP_NOT:\r
+ case EFI_FMP_DEP_TRUE:\r
+ case EFI_FMP_DEP_FALSE:\r
+ case EFI_FMP_DEP_EQ:\r
+ case EFI_FMP_DEP_GT:\r
+ case EFI_FMP_DEP_GTE:\r
+ case EFI_FMP_DEP_LT:\r
+ case EFI_FMP_DEP_LTE:\r
+ Depex += 1;\r
+ break;\r
+ case EFI_FMP_DEP_END:\r
+ Depex += 1;\r
+ if (DepexSize != NULL) {\r
+ *DepexSize = (UINT32)(Depex - Dependencies->Dependencies);\r
+ }\r
+\r
+ return TRUE;\r
+ default:\r
+ return FALSE;\r
}\r
}\r
\r
@retval Null\r
\r
**/\r
-EFI_FIRMWARE_IMAGE_DEP*\r
+EFI_FIRMWARE_IMAGE_DEP *\r
EFIAPI\r
GetImageDependency (\r
- IN EFI_FIRMWARE_IMAGE_AUTHENTICATION *Image,\r
- IN UINTN ImageSize,\r
- OUT UINT32 *DepexSize,\r
- OUT UINT32 *LastAttemptStatus OPTIONAL\r
+ IN EFI_FIRMWARE_IMAGE_AUTHENTICATION *Image,\r
+ IN UINTN ImageSize,\r
+ OUT UINT32 *DepexSize,\r
+ OUT UINT32 *LastAttemptStatus OPTIONAL\r
)\r
{\r
- EFI_FIRMWARE_IMAGE_DEP *Depex;\r
- UINTN MaxDepexSize;\r
+ EFI_FIRMWARE_IMAGE_DEP *Depex;\r
+ UINTN MaxDepexSize;\r
\r
if (Image == NULL) {\r
return NULL;\r
//\r
// Check to make sure that operation can be safely performed.\r
//\r
- if (((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) < (UINTN)Image || \\r
- ((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) >= (UINTN)Image + ImageSize) {\r
+ if ((((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) < (UINTN)Image) || \\r
+ (((UINTN)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength) >= (UINTN)Image + ImageSize))\r
+ {\r
//\r
// Pointer overflow. Invalid image.\r
//\r
if (LastAttemptStatus != NULL) {\r
*LastAttemptStatus = LAST_ATTEMPT_STATUS_DEPENDENCY_LIB_ERROR_GET_DEPEX_FAILURE;\r
}\r
+\r
return NULL;\r
}\r
\r
- Depex = (EFI_FIRMWARE_IMAGE_DEP*)((UINT8 *)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength);\r
+ Depex = (EFI_FIRMWARE_IMAGE_DEP *)((UINT8 *)Image + sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength);\r
MaxDepexSize = ImageSize - (sizeof (Image->MonotonicCount) + Image->AuthInfo.Hdr.dwLength);\r
\r
//\r