diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 1b019a3e5f..3ab0a6c037 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,3 +1,9 @@ +2020-06-26 Nick Alcock + + * ctf-create.c (ctf_add_forward): Intern in the right namespace. + (ctf_dtd_delete): Remove correspondingly. + (ctf_rollback): Likewise. + 2020-06-26 Nick Alcock * ctf-create.c (ctf_add_type_internal): Hand back existing types diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index 7e94a254c5..a01250bc4d 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -622,6 +622,7 @@ ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd) { ctf_dmdef_t *dmd, *nmd; int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info); + int name_kind = kind; const char *name; ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type); @@ -643,13 +644,16 @@ ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd) case CTF_K_FUNCTION: free (dtd->dtd_u.dtu_argv); break; + case CTF_K_FORWARD: + name_kind = dtd->dtd_data.ctt_type; + break; } if (dtd->dtd_data.ctt_name && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info)) { - ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable, + ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable, name); ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name); } @@ -761,6 +765,8 @@ ctf_rollback (ctf_file_t *fp, ctf_snapshot_id_t id) continue; kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info); + if (kind == CTF_K_FORWARD) + kind = dtd->dtd_data.ctt_type; if (dtd->dtd_data.ctt_name && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL @@ -1232,7 +1238,7 @@ ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name, if (type) return type; - if ((type = ctf_add_generic (fp, flag, name, CTF_K_FORWARD, &dtd)) == CTF_ERR) + if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR) return CTF_ERR; /* errno is set for us. */ dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);