aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-serialize.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2024-01-30 13:40:56 +0000
committerNick Alcock <nick.alcock@oracle.com>2024-04-19 16:14:46 +0100
commit3301ddba1badc50a06f5d21c78790d508969081d (patch)
tree00d35473ebf3d731ba89ece69fe8406696f5b3ba /libctf/ctf-serialize.c
parent629acbe4a32fc2a53e448ce2c704e788f9fbad9f (diff)
downloadbinutils-3301ddba1badc50a06f5d21c78790d508969081d.zip
binutils-3301ddba1badc50a06f5d21c78790d508969081d.tar.gz
binutils-3301ddba1badc50a06f5d21c78790d508969081d.tar.bz2
Revert "libctf: do not corrupt strings across ctf_serialize"
This reverts commit 986e9e3aa03f854bedacef7fac38fe8f009a416c. (We do not revert the testcase -- it remains valid -- but we are taking a different, less complex and more robust approach.) This also deletes the pending refs abstraction without (yet) replacing it, so some tests will fail for a commit or two.
Diffstat (limited to 'libctf/ctf-serialize.c')
-rw-r--r--libctf/ctf-serialize.c24
1 files changed, 1 insertions, 23 deletions
diff --git a/libctf/ctf-serialize.c b/libctf/ctf-serialize.c
index 9dd7fbd..2afc7be 100644
--- a/libctf/ctf-serialize.c
+++ b/libctf/ctf-serialize.c
@@ -822,10 +822,7 @@ ctf_emit_type_sect (ctf_dict_t *fp, unsigned char **tptr)
copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
if (copied->ctt_name
&& (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
- {
- ctf_str_add_ref (fp, name, &copied->ctt_name);
- ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
- }
+ ctf_str_add_ref (fp, name, &copied->ctt_name);
copied->ctt_size = type_ctt_size;
t += len;
@@ -960,7 +957,6 @@ ctf_serialize (ctf_dict_t *fp)
ctf_varent_t *dvarents;
ctf_strs_writable_t strtab;
int err;
- int num_missed_str_refs;
int sym_functions = 0;
unsigned char *t;
@@ -980,16 +976,6 @@ ctf_serialize (ctf_dict_t *fp)
if (fp->ctf_stypes > 0)
return (ctf_set_errno (fp, ECTF_RDONLY));
- /* The strtab refs table must be empty at this stage. Any refs already added
- will be corrupted by any modifications, including reserialization, after
- strtab finalization is complete. Only this function, and functions it
- calls, may add refs, and all memory locations (including in the dtds)
- containing strtab offsets must be traversed as part of serialization, and
- refs added. */
-
- if (!ctf_assert (fp, fp->ctf_str_num_refs == 0))
- return -1; /* errno is set for us. */
-
/* Fill in an initial CTF header. We will leave the label, object,
and function sections empty and only output a header, type section,
and string table. The type section begins at a 4-byte aligned
@@ -1103,12 +1089,6 @@ ctf_serialize (ctf_dict_t *fp)
assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
- /* Every string added outside serialization by ctf_str_add_pending should
- now have been added by ctf_add_ref. */
- num_missed_str_refs = ctf_dynset_elements (fp->ctf_str_pending_ref);
- if (!ctf_assert (fp, num_missed_str_refs == 0))
- goto err; /* errno is set for us. */
-
/* Construct the final string table and fill out all the string refs with the
final offsets. Then purge the refs list, because we're about to move this
strtab onto the end of the buf, invalidating all the offsets. */
@@ -1211,10 +1191,8 @@ ctf_serialize (ctf_dict_t *fp)
ctf_str_free_atoms (nfp);
nfp->ctf_str_atoms = fp->ctf_str_atoms;
nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
- nfp->ctf_str_pending_ref = fp->ctf_str_pending_ref;
fp->ctf_str_atoms = NULL;
fp->ctf_prov_strtab = NULL;
- fp->ctf_str_pending_ref = NULL;
memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
fp->ctf_add_processing = NULL;