RedfishPkg/JsonLib: fix JsonObjectGetValue issue

JsonObjectGetValue() cannot find corresponding JSON value
when the EDKII_JSON_VALUE object is created by another UEFI
driver. This is because "hashtable_seed" is initialized by
current time while JsonLib is loaded. So, "hashtable_seed"
will be different in each individual UEFI driver.

Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
Reviewed-by: Igor Kulchytskyy <igork@ami.com>
Reviewed-by: Abner Chang <abner.chang@amd.com>
This commit is contained in:
Nickle Wang 2023-09-18 20:03:30 +08:00 committed by mergify[bot]
parent ea628f28e5
commit f67e1934d9
2 changed files with 36 additions and 0 deletions

View File

@ -19,6 +19,8 @@
#include "jansson.h"
extern volatile UINT32 hashtable_seed;
/**
The function is used to initialize a JSON value which contains a new JSON array,
or NULL on error. Initially, the array is empty.
@ -1138,3 +1140,36 @@ JsonGetType (
{
return (EDKII_JSON_TYPE)(((json_t *)JsonValue)->type);
}
/**
JSON Library constructor.
@param ImageHandle The image handle.
@param SystemTable The system table.
@retval EFI_SUCCESS Protocol listener is registered successfully.
**/
EFI_STATUS
EFIAPI
JsonLibConstructor (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
//
// hashtable_seed is initalized by current time while JsonLib is loaded.
// Due to above mechanism, hashtable_seed will be different in each individual
// UEFI driver. As the result, the hash of same key in different UEFI driver
// would be different. This breaks JsonObjectGetValue() because
// JsonObjectGetValue() won't be able to find corresponding JSON value if
// this EDKII_JSON_VALUE is created by another UEFI driver.
//
// Initial the seed to a fixed magic value for JsonLib to be working in all
// UEFI drivers. This fixed number will be removed after the protocol version
// of JsonLib is implemented in the future.
//
hashtable_seed = 0xFDAE2143;
return EFI_SUCCESS;
}

View File

@ -15,6 +15,7 @@
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
LIBRARY_CLASS = JsonLib|DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER
CONSTRUCTOR = JsonLibConstructor
#
# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 RISCV64