On 5/11/25 12:44, Gavin Shan wrote:
For one particular error (Error), we can't call error_setg() for twice.
Otherwise, the assert(*errp == NULL) will be triggered unexpectedly in
error_setv(). In ghes_record_cper_errors(), get_ghes_source_offsets()
can return a error initialized by error_setg(). Without bailing on
this error, it can call into the second error_setg() due to the
unexpected value from the read acknowledgement register.

Bail early in ghes_record_cper_errors() when error is received from
get_ghes_source_offsets() to avoid the exception.

Signed-off-by: Gavin Shan <[email protected]>
---
  hw/acpi/ghes.c | 3 +++
  1 file changed, 3 insertions(+)

diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c
index 527b85c8d8..055e5d719a 100644
--- a/hw/acpi/ghes.c
+++ b/hw/acpi/ghes.c
@@ -513,6 +513,9 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const void 
*cper, size_t len,
      } else {
          get_ghes_source_offsets(source_id, le64_to_cpu(ags->hest_addr_le),
                                  &cper_addr, &read_ack_register_addr, errp);
+        if (*errp) {
+            return;
+        }

If get_ghes_source_offsets() can fail, then lets have it return a
boolean.

  if (!get_ghes_source_offsets(..., errp)) {
      return;
  }

See commit e3fe3988d78 ("error: Document Error API usage rules").

Reply via email to