Implement common logging function
When used as a library, it's desirable to be able to suppress logging,
or pipe logging through a different path. This commit changes behavior
such that logging is disabled by default, and introduces 2 new methods,
cper_set_log_stdio and cper_set_log_custom.
These allow library integrators to specify their logging mode. In
practice, this also allows fuzzing to run faster by not printing errors
to the log.
Change-Id: I941476627bc9b8261ba5f6c0b2b2338fdf931dd2
Signed-off-by: Ed Tanous <etanous@nvidia.com>
diff --git a/sections/cper-section-arm.c b/sections/cper-section-arm.c
index cd06131..6961d16 100644
--- a/sections/cper-section-arm.c
+++ b/sections/cper-section-arm.c
@@ -12,6 +12,7 @@
#include <libcper/Cper.h>
#include <libcper/cper-utils.h>
#include <libcper/sections/cper-section-arm.h>
+#include <libcper/log.h>
//Private pre-definitions.
json_object *
@@ -123,7 +124,8 @@
(record->ErrInfoNum * sizeof(EFI_ARM_ERROR_INFORMATION_ENTRY))) {
json_object_put(error_info_array);
json_object_put(section_ir);
- printf("Invalid CPER file: Invalid processor error info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor error info num.\n");
return NULL;
}
for (int i = 0; i < record->ErrInfoNum; i++) {
@@ -147,7 +149,8 @@
sizeof(EFI_ARM_CONTEXT_INFORMATION_HEADER)) {
json_object_put(context_info_array);
json_object_put(section_ir);
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
return NULL;
}
EFI_ARM_CONTEXT_INFORMATION_HEADER *header =
@@ -161,7 +164,8 @@
if (processor_context == NULL) {
json_object_put(context_info_array);
json_object_put(section_ir);
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
return NULL;
}
json_object_array_add(context_info_array, processor_context);
@@ -177,7 +181,8 @@
if (remaining_size < input_size) {
json_object_put(vendor_specific);
json_object_put(section_ir);
- printf("Invalid CPER file: Invalid vendor-specific info length.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid vendor-specific info length.\n");
return NULL;
}
int32_t encoded_len = 0;
@@ -186,7 +191,8 @@
if (encoded == NULL) {
json_object_put(vendor_specific);
json_object_put(section_ir);
- printf("base64 encode of vendorSpecificInfo failed\n");
+ cper_print_log(
+ "base64 encode of vendorSpecificInfo failed\n");
return NULL;
}
json_object_object_add(vendor_specific, "data",
@@ -197,7 +203,8 @@
json_object_object_add(section_ir, "vendorSpecificInfo",
vendor_specific);
} else {
- printf("vendorSpecificInfo is marked valid but not present in binary\n");
+ cper_print_log(
+ "vendorSpecificInfo is marked valid but not present in binary\n");
}
}
@@ -497,7 +504,8 @@
const UINT8 **cur_pos, UINT32 *remaining_size)
{
if (header->RegisterArraySize > *remaining_size) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
return NULL;
}
@@ -526,12 +534,14 @@
switch (header->RegisterContextType) {
case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
if (*remaining_size < sizeof(EFI_ARM_V8_AARCH32_GPR)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_V8_AARCH32_GPR)) {
- printf("Invalid CPER file: Not enough bytes for aarch32 gpr\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch32 gpr\n");
goto fail;
}
register_array = uniform_struct_to_ir(
@@ -542,12 +552,14 @@
case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
if (*remaining_size <
sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch32 el1\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch32 el1\n");
goto fail;
}
register_array = uniform_struct_to_ir(
@@ -559,12 +571,14 @@
case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
if (*remaining_size <
sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch32 el2\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch32 el2\n");
goto fail;
}
register_array = uniform_struct_to_ir(
@@ -578,12 +592,14 @@
if (*remaining_size <
sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS)) {
json_object_put(context_ir);
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
return NULL;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch32 secure\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch32 secure\n");
goto fail;
}
register_array = uniform_struct_to_ir(
@@ -594,12 +610,14 @@
break;
case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
if (*remaining_size < sizeof(EFI_ARM_V8_AARCH64_GPR)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_V8_AARCH64_GPR)) {
- printf("Invalid CPER file: Not enough bytes for aarch64 gpr\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch64 gpr\n");
goto fail;
}
register_array = uniform_struct64_to_ir(
@@ -610,12 +628,14 @@
case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
if (*remaining_size <
sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch64 el1\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch64 el1\n");
goto fail;
}
register_array = uniform_struct64_to_ir(
@@ -627,12 +647,14 @@
case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
if (*remaining_size <
sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch64 el2\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch64 el2\n");
goto fail;
}
register_array = uniform_struct64_to_ir(
@@ -644,12 +666,14 @@
case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
if (*remaining_size <
sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS)) {
- printf("Invalid CPER file: Not enough bytes for aarch64 el3\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for aarch64 el3\n");
goto fail;
}
register_array = uniform_struct64_to_ir(
@@ -660,12 +684,14 @@
break;
case EFI_ARM_CONTEXT_TYPE_MISC:
if (*remaining_size < sizeof(EFI_ARM_MISC_CONTEXT_REGISTER)) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
if (header->RegisterArraySize <
sizeof(EFI_ARM_MISC_CONTEXT_REGISTER)) {
- printf("Invalid CPER file: Not enough bytes for misc\n");
+ cper_print_log(
+ "Invalid CPER file: Not enough bytes for misc\n");
goto fail;
}
register_array = cper_arm_misc_register_array_to_ir(
@@ -673,7 +699,8 @@
break;
default:
if (*remaining_size < header->RegisterArraySize) {
- printf("Invalid CPER file: Invalid processor context info num.\n");
+ cper_print_log(
+ "Invalid CPER file: Invalid processor context info num.\n");
goto fail;
}
//Unknown register array type, add as base64 data instead.
@@ -1274,7 +1301,7 @@
&decoded_len);
if (decoded == NULL) {
- printf("Failed to allocate decode output buffer. \n");
+ cper_print_log("Failed to allocate decode output buffer. \n");
} else {
//Flush out to stream.
fwrite(&decoded, decoded_len, 1, out);