libctf: dump: do not stop dumping types on error

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.
This commit is contained in:
Nick Alcock
2021-10-25 11:17:02 +01:00
parent 10909ea819
commit a0cc569d59
2 changed files with 14 additions and 4 deletions

View 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> 2021-09-27 Nick Alcock <nick.alcock@oracle.com>
* ctf-lookup.c (ctf_lookup_by_name_internal): Fix pptrtab bounds. * ctf-lookup.c (ctf_lookup_by_name_internal): Fix pptrtab bounds.

View File

@@ -564,7 +564,6 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg)
{ {
char *str; char *str;
char *indent; char *indent;
int err = 0;
ctf_dump_state_t *state = arg; ctf_dump_state_t *state = arg;
ctf_dump_membstate_t membstate = { &str, state->cds_fp, NULL }; 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) if (asprintf (&bit, "%s: %i\n", enumerand, value) < 0)
{ {
err = ENOMEM;
ctf_next_destroy (it); ctf_next_destroy (it);
goto err; goto oom;
} }
str = str_append (str, bit); str = str_append (str, bit);
free (bit); free (bit);
@@ -648,7 +646,15 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg)
err: err:
free (indent); free (indent);
free (str); 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. */ /* Dump the string table into the cds_items. */