aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libctf/ChangeLog10
-rw-r--r--libctf/ctf-dedup.c7
-rw-r--r--libctf/ctf-string.c9
-rw-r--r--libctf/ctf-types.c8
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);
}