diff options
-rw-r--r-- | libctf/ChangeLog | 10 | ||||
-rw-r--r-- | libctf/ctf-dedup.c | 7 | ||||
-rw-r--r-- | libctf/ctf-string.c | 9 | ||||
-rw-r--r-- | libctf/ctf-types.c | 8 |
4 files changed, 26 insertions, 8 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index c700297..35c22d9 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,15 @@ 2021-01-27 Nick Alcock <nick.alcock@oracle.com> + * ctf-string.c (ctf_str_add): Treat adding a NULL as adding "". + (ctf_str_add_ref): Likewise. + (ctf_str_add_external): Likewise. + * ctf-types.c (ctf_type_name_raw): Always return "" for offset 0. + * ctf-dedup.c (ctf_dedup_multiple_input_dicts): Don't armour + against NULL name. + (ctf_dedup_maybe_synthesize_forward): Likewise. + +2021-01-27 Nick Alcock <nick.alcock@oracle.com> + * ctf-create.c (ctf_serialize): Fix shadowing. 2021-01-27 Nick Alcock <nick.alcock@oracle.com> diff --git a/libctf/ctf-dedup.c b/libctf/ctf-dedup.c index da88ae371..001c248 100644 --- a/libctf/ctf-dedup.c +++ b/libctf/ctf-dedup.c @@ -1776,7 +1776,7 @@ ctf_dedup_multiple_input_dicts (ctf_dict_t *output, ctf_dict_t **inputs, name = ctf_type_name_raw (input_fp, input_id); if ((fwdkind == CTF_K_STRUCT || fwdkind == CTF_K_UNION) - && name && name[0] != '\0') + && name[0] != '\0') { const void *origin; @@ -2375,20 +2375,19 @@ ctf_dedup_maybe_synthesize_forward (ctf_dict_t *output, ctf_dict_t *target, ctf_dedup_t *td = &target->ctf_dedup; int kind; int fwdkind; - const char *name; + const char *name = ctf_type_name_raw (input, id); const char *decorated; void *v; ctf_id_t emitted_forward; if (!ctf_dynset_exists (od->cd_conflicting_types, hval, NULL) || target->ctf_flags & LCTF_CHILD - || !ctf_type_name_raw (input, id) + || name[0] == '\0' || (((kind = ctf_type_kind_unsliced (input, id)) != CTF_K_STRUCT && kind != CTF_K_UNION && kind != CTF_K_FORWARD))) return 0; fwdkind = ctf_type_kind_forwarded (input, id); - name = ctf_type_name_raw (input, id); ctf_dprintf ("Using synthetic forward for conflicted struct/union with " "hval %s\n", hval); diff --git a/libctf/ctf-string.c b/libctf/ctf-string.c index cb36f91..91ad2e3 100644 --- a/libctf/ctf-string.c +++ b/libctf/ctf-string.c @@ -218,8 +218,9 @@ uint32_t ctf_str_add (ctf_dict_t *fp, const char *str) { ctf_str_atom_t *atom; + if (!str) - return 0; + str = ""; atom = ctf_str_add_ref_internal (fp, str, FALSE, TRUE, 0); if (!atom) @@ -235,8 +236,9 @@ uint32_t ctf_str_add_ref (ctf_dict_t *fp, const char *str, uint32_t *ref) { ctf_str_atom_t *atom; + if (!str) - return 0; + str = ""; atom = ctf_str_add_ref_internal (fp, str, TRUE, TRUE, ref); if (!atom) @@ -251,8 +253,9 @@ int ctf_str_add_external (ctf_dict_t *fp, const char *str, uint32_t offset) { ctf_str_atom_t *atom; + if (!str) - return 0; + str = ""; atom = ctf_str_add_ref_internal (fp, str, FALSE, FALSE, 0); if (!atom) diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index 4129fbc..57a284d 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -922,7 +922,10 @@ ctf_type_name (ctf_dict_t *fp, ctf_id_t type, char *buf, size_t len) } /* Lookup the given type ID and return its raw, unadorned, undecorated name. - The name will live as long as its ctf_dict_t does. */ + The name will live as long as its ctf_dict_t does. + + The only decoration is that a NULL return always means an error: nameless + types return a null string. */ const char * ctf_type_name_raw (ctf_dict_t *fp, ctf_id_t type) @@ -932,6 +935,9 @@ ctf_type_name_raw (ctf_dict_t *fp, ctf_id_t type) if ((tp = ctf_lookup_by_id (&fp, type)) == NULL) return NULL; /* errno is set for us. */ + if (tp->ctt_name == 0) + return ""; + return ctf_strraw (fp, tp->ctt_name); } |