mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
225 lines
7.1 KiB
C
225 lines
7.1 KiB
C
/** @file
|
|
Copyright (C) 2018, vit9696. All rights reserved.
|
|
Copyright (C) 2020, PMheart. All rights reserved.
|
|
|
|
All rights reserved.
|
|
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
**/
|
|
|
|
#include "ocvalidate.h"
|
|
#include "OcValidateLib.h"
|
|
|
|
/**
|
|
Callback function to verify whether one entry is duplicated in DeviceProperties->Add.
|
|
|
|
@param[in] PrimaryEntry Primary entry to be checked.
|
|
@param[in] SecondaryEntry Secondary entry to be checked.
|
|
|
|
@retval TRUE If PrimaryEntry and SecondaryEntry are duplicated.
|
|
**/
|
|
STATIC
|
|
BOOLEAN
|
|
DevPropsAddHasDuplication (
|
|
IN CONST VOID *PrimaryEntry,
|
|
IN CONST VOID *SecondaryEntry
|
|
)
|
|
{
|
|
CONST OC_STRING *DevPropsAddPrimaryEntry;
|
|
CONST OC_STRING *DevPropsAddSecondaryEntry;
|
|
CONST CHAR8 *DevPropsAddPrimaryDevicePathString;
|
|
CONST CHAR8 *DevPropsAddSecondaryDevicePathString;
|
|
|
|
DevPropsAddPrimaryEntry = *(CONST OC_STRING **)PrimaryEntry;
|
|
DevPropsAddSecondaryEntry = *(CONST OC_STRING **)SecondaryEntry;
|
|
DevPropsAddPrimaryDevicePathString = OC_BLOB_GET (DevPropsAddPrimaryEntry);
|
|
DevPropsAddSecondaryDevicePathString = OC_BLOB_GET (DevPropsAddSecondaryEntry);
|
|
|
|
return StringIsDuplicated ("DeviceProperties->Add", DevPropsAddPrimaryDevicePathString, DevPropsAddSecondaryDevicePathString);
|
|
}
|
|
|
|
/**
|
|
Callback function to verify whether one entry is duplicated in DeviceProperties->Delete.
|
|
|
|
@param[in] PrimaryEntry Primary entry to be checked.
|
|
@param[in] SecondaryEntry Secondary entry to be checked.
|
|
|
|
@retval TRUE If PrimaryEntry and SecondaryEntry are duplicated.
|
|
**/
|
|
STATIC
|
|
BOOLEAN
|
|
DevPropsDeleteHasDuplication (
|
|
IN CONST VOID *PrimaryEntry,
|
|
IN CONST VOID *SecondaryEntry
|
|
)
|
|
{
|
|
CONST OC_STRING *DevPropsDeletePrimaryEntry;
|
|
CONST OC_STRING *DevPropsDeleteSecondaryEntry;
|
|
CONST CHAR8 *DevPropsDeletePrimaryDevicePathString;
|
|
CONST CHAR8 *DevPropsDeleteSecondaryDevicePathString;
|
|
|
|
DevPropsDeletePrimaryEntry = *(CONST OC_STRING **)PrimaryEntry;
|
|
DevPropsDeleteSecondaryEntry = *(CONST OC_STRING **)SecondaryEntry;
|
|
DevPropsDeletePrimaryDevicePathString = OC_BLOB_GET (DevPropsDeletePrimaryEntry);
|
|
DevPropsDeleteSecondaryDevicePathString = OC_BLOB_GET (DevPropsDeleteSecondaryEntry);
|
|
|
|
return StringIsDuplicated ("DeviceProperties->Delete", DevPropsDeletePrimaryDevicePathString, DevPropsDeleteSecondaryDevicePathString);
|
|
}
|
|
|
|
STATIC
|
|
UINT32
|
|
CheckDevicePropertiesAdd (
|
|
IN OC_GLOBAL_CONFIG *Config
|
|
)
|
|
{
|
|
UINT32 ErrorCount;
|
|
UINT32 DeviceIndex;
|
|
UINT32 PropertyIndex;
|
|
CONST CHAR8 *AsciiDevicePath;
|
|
CONST CHAR8 *AsciiProperty;
|
|
OC_ASSOC *PropertyMap;
|
|
|
|
ErrorCount = 0;
|
|
|
|
for (DeviceIndex = 0; DeviceIndex < Config->DeviceProperties.Add.Count; ++DeviceIndex) {
|
|
AsciiDevicePath = OC_BLOB_GET (Config->DeviceProperties.Add.Keys[DeviceIndex]);
|
|
|
|
if (!AsciiDevicePathIsLegal (AsciiDevicePath)) {
|
|
DEBUG ((DEBUG_WARN, "DeviceProperties->Add[%u]->DevicePath is borked! Please check the information above!\n", DeviceIndex));
|
|
++ErrorCount;
|
|
}
|
|
|
|
PropertyMap = Config->DeviceProperties.Add.Values[DeviceIndex];
|
|
for (PropertyIndex = 0; PropertyIndex < PropertyMap->Count; ++PropertyIndex) {
|
|
AsciiProperty = OC_BLOB_GET (PropertyMap->Keys[PropertyIndex]);
|
|
|
|
//
|
|
// Sanitise strings.
|
|
//
|
|
if (!AsciiPropertyIsLegal (AsciiProperty)) {
|
|
DEBUG ((
|
|
DEBUG_WARN,
|
|
"DeviceProperties->Add[%u]->Property[%u] contains illegal character!\n",
|
|
DeviceIndex,
|
|
PropertyIndex
|
|
));
|
|
++ErrorCount;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check duplicated properties in DeviceProperties->Add[N].
|
|
//
|
|
ErrorCount += FindArrayDuplication (
|
|
PropertyMap->Keys,
|
|
PropertyMap->Count,
|
|
sizeof (PropertyMap->Keys[0]),
|
|
DevPropsAddHasDuplication
|
|
);
|
|
}
|
|
|
|
//
|
|
// Check duplicated entries in DeviceProperties->Add.
|
|
//
|
|
ErrorCount += FindArrayDuplication (
|
|
Config->DeviceProperties.Add.Keys,
|
|
Config->DeviceProperties.Add.Count,
|
|
sizeof (Config->DeviceProperties.Add.Keys[0]),
|
|
DevPropsAddHasDuplication
|
|
);
|
|
|
|
return ErrorCount;
|
|
}
|
|
|
|
STATIC
|
|
UINT32
|
|
CheckDevicePropertiesDelete (
|
|
IN OC_GLOBAL_CONFIG *Config
|
|
)
|
|
{
|
|
UINT32 ErrorCount;
|
|
UINT32 DeviceIndex;
|
|
UINT32 PropertyIndex;
|
|
CONST CHAR8 *AsciiDevicePath;
|
|
CONST CHAR8 *AsciiProperty;
|
|
|
|
ErrorCount = 0;
|
|
|
|
for (DeviceIndex = 0; DeviceIndex < Config->DeviceProperties.Delete.Count; ++DeviceIndex) {
|
|
AsciiDevicePath = OC_BLOB_GET (Config->DeviceProperties.Delete.Keys[DeviceIndex]);
|
|
|
|
if (!AsciiDevicePathIsLegal (AsciiDevicePath)) {
|
|
DEBUG ((DEBUG_WARN, "DeviceProperties->Delete[%u]->DevicePath is borked! Please check the information above!\n", DeviceIndex));
|
|
++ErrorCount;
|
|
}
|
|
|
|
for (PropertyIndex = 0; PropertyIndex < Config->DeviceProperties.Delete.Values[DeviceIndex]->Count; ++PropertyIndex) {
|
|
AsciiProperty = OC_BLOB_GET (Config->DeviceProperties.Delete.Values[DeviceIndex]->Values[PropertyIndex]);
|
|
|
|
//
|
|
// Sanitise strings.
|
|
//
|
|
if (!AsciiPropertyIsLegal (AsciiProperty)) {
|
|
DEBUG ((
|
|
DEBUG_WARN,
|
|
"DeviceProperties->Delete[%u]->Property[%u] contains illegal character!\n",
|
|
DeviceIndex,
|
|
PropertyIndex
|
|
));
|
|
++ErrorCount;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check duplicated properties in DeviceProperties->Delete[N].
|
|
//
|
|
ErrorCount += FindArrayDuplication (
|
|
Config->DeviceProperties.Delete.Values[DeviceIndex]->Values,
|
|
Config->DeviceProperties.Delete.Values[DeviceIndex]->Count,
|
|
sizeof (Config->DeviceProperties.Delete.Values[DeviceIndex]->Values[0]),
|
|
DevPropsDeleteHasDuplication
|
|
);
|
|
}
|
|
|
|
//
|
|
// Check duplicated entries in DeviceProperties->Delete.
|
|
//
|
|
ErrorCount += FindArrayDuplication (
|
|
Config->DeviceProperties.Delete.Keys,
|
|
Config->DeviceProperties.Delete.Count,
|
|
sizeof (Config->DeviceProperties.Delete.Keys[0]),
|
|
DevPropsDeleteHasDuplication
|
|
);
|
|
|
|
return ErrorCount;
|
|
}
|
|
|
|
UINT32
|
|
CheckDeviceProperties (
|
|
IN OC_GLOBAL_CONFIG *Config
|
|
)
|
|
{
|
|
UINT32 ErrorCount;
|
|
UINTN Index;
|
|
STATIC CONFIG_CHECK DevicePropertiesCheckers[] = {
|
|
&CheckDevicePropertiesAdd,
|
|
&CheckDevicePropertiesDelete
|
|
};
|
|
|
|
DEBUG ((DEBUG_VERBOSE, "config loaded into %a!\n", __func__));
|
|
|
|
ErrorCount = 0;
|
|
|
|
for (Index = 0; Index < ARRAY_SIZE (DevicePropertiesCheckers); ++Index) {
|
|
ErrorCount += DevicePropertiesCheckers[Index](Config);
|
|
}
|
|
|
|
return ReportError (__func__, ErrorCount);
|
|
}
|