libctf: dump: do not stop dumping types on error
authorNick Alcock <nick.alcock@oracle.com>
Mon, 25 Oct 2021 10:17:02 +0000 (11:17 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Mon, 25 Oct 2021 10:17:04 +0000 (11:17 +0100)
If dumping of a single type fails, we obviously can't dump it; but just
as obviously this doesn't make the other types in the types section
invalid or undumpable.  So we should not propagate errors seen when
type-dumping, but rather ignore them and carry on, so we dump as many
types as we can (leaving out the ones we can't grok).

libctf/ChangeLog
2021-10-25  Nick Alcock  <nick.alcock@oracle.com>

* ctf-dump.c (ctf_dump_type): Do not abort on error.

libctf/ChangeLog
libctf/ctf-dump.c

index 5907e2f856ae529322fb47bf617166962860bb65..879e128126af14f4a0c9967044e55c4b6c195c93 100644 (file)
@@ -1,3 +1,7 @@
+2021-10-25  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-dump.c (ctf_dump_type): Do not abort on error.
+
 2021-09-27  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-lookup.c (ctf_lookup_by_name_internal): Fix pptrtab bounds.
index bd9b50d94790bf7cb926ec398a84f64625c592f5..b6af0dfe419a35dd402cf198d3ae46750100f8b9 100644 (file)
@@ -564,7 +564,6 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg)
 {
   char *str;
   char *indent;
-  int err = 0;
   ctf_dump_state_t *state = arg;
   ctf_dump_membstate_t membstate = { &str, state->cds_fp, NULL };
 
@@ -619,9 +618,8 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg)
 
          if (asprintf (&bit, "%s: %i\n", enumerand, value) < 0)
            {
-             err = ENOMEM;
              ctf_next_destroy (it);
-             goto err;
+             goto oom;
            }
          str = str_append (str, bit);
          free (bit);
@@ -648,7 +646,15 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg)
  err:
   free (indent);
   free (str);
-  return ctf_set_errno (state->cds_fp, err);
+
+  /* Swallow the error: don't cause an error in one type to abort all
+     type dumping.  */
+  return 0;
+
+ oom:
+  free (indent);
+  free (str);
+  return ctf_set_errno (state->cds_fp, ENOMEM);
 }
 
 /* Dump the string table into the cds_items.  */