forked from Imagelibrary/binutils-gdb
Revert "libctf: do not corrupt strings across ctf_serialize"
This reverts commit 986e9e3aa0.
(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.
This commit is contained in:
@@ -128,7 +128,7 @@ ctf_str_create_atoms (ctf_dict_t *fp)
|
||||
{
|
||||
fp->ctf_str_atoms = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
|
||||
free, ctf_str_free_atom);
|
||||
if (!fp->ctf_str_atoms)
|
||||
if (fp->ctf_str_atoms == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!fp->ctf_prov_strtab)
|
||||
@@ -138,13 +138,6 @@ ctf_str_create_atoms (ctf_dict_t *fp)
|
||||
if (!fp->ctf_prov_strtab)
|
||||
goto oom_prov_strtab;
|
||||
|
||||
if (!fp->ctf_str_pending_ref)
|
||||
fp->ctf_str_pending_ref = ctf_dynset_create (htab_hash_pointer,
|
||||
htab_eq_pointer,
|
||||
NULL);
|
||||
if (!fp->ctf_str_pending_ref)
|
||||
goto oom_str_pending_ref;
|
||||
|
||||
errno = 0;
|
||||
ctf_str_add (fp, "");
|
||||
if (errno == ENOMEM)
|
||||
@@ -155,9 +148,6 @@ ctf_str_create_atoms (ctf_dict_t *fp)
|
||||
oom_str_add:
|
||||
ctf_dynhash_destroy (fp->ctf_prov_strtab);
|
||||
fp->ctf_prov_strtab = NULL;
|
||||
oom_str_pending_ref:
|
||||
ctf_dynset_destroy (fp->ctf_str_pending_ref);
|
||||
fp->ctf_str_pending_ref = NULL;
|
||||
oom_prov_strtab:
|
||||
ctf_dynhash_destroy (fp->ctf_str_atoms);
|
||||
fp->ctf_str_atoms = NULL;
|
||||
@@ -170,13 +160,8 @@ ctf_str_free_atoms (ctf_dict_t *fp)
|
||||
{
|
||||
ctf_dynhash_destroy (fp->ctf_prov_strtab);
|
||||
ctf_dynhash_destroy (fp->ctf_str_atoms);
|
||||
ctf_dynset_destroy (fp->ctf_str_pending_ref);
|
||||
}
|
||||
|
||||
#define CTF_STR_ADD_REF 0x1
|
||||
#define CTF_STR_MAKE_PROVISIONAL 0x2
|
||||
#define CTF_STR_PENDING_REF 0x4
|
||||
|
||||
/* Add a string to the atoms table, copying the passed-in string. Return the
|
||||
atom added. Return NULL only when out of memory (and do not touch the
|
||||
passed-in string in that case). Possibly augment the ref list with the
|
||||
@@ -184,7 +169,7 @@ ctf_str_free_atoms (ctf_dict_t *fp)
|
||||
provisional strtab. */
|
||||
static ctf_str_atom_t *
|
||||
ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str,
|
||||
int flags, uint32_t *ref)
|
||||
int add_ref, int make_provisional, uint32_t *ref)
|
||||
{
|
||||
char *newstr = NULL;
|
||||
ctf_str_atom_t *atom = NULL;
|
||||
@@ -192,7 +177,7 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str,
|
||||
|
||||
atom = ctf_dynhash_lookup (fp->ctf_str_atoms, str);
|
||||
|
||||
if (flags & CTF_STR_ADD_REF)
|
||||
if (add_ref)
|
||||
{
|
||||
if ((aref = malloc (sizeof (struct ctf_str_atom_ref))) == NULL) {
|
||||
ctf_set_errno (fp, ENOMEM);
|
||||
@@ -203,9 +188,8 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str,
|
||||
|
||||
if (atom)
|
||||
{
|
||||
if (flags & CTF_STR_ADD_REF)
|
||||
if (add_ref)
|
||||
{
|
||||
ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref);
|
||||
ctf_list_append (&atom->csa_refs, aref);
|
||||
fp->ctf_str_num_refs++;
|
||||
}
|
||||
@@ -225,7 +209,7 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str,
|
||||
atom->csa_str = newstr;
|
||||
atom->csa_snapshot_id = fp->ctf_snapshots;
|
||||
|
||||
if (flags & CTF_STR_MAKE_PROVISIONAL)
|
||||
if (make_provisional)
|
||||
{
|
||||
atom->csa_offset = fp->ctf_str_prov_offset;
|
||||
|
||||
@@ -236,14 +220,8 @@ ctf_str_add_ref_internal (ctf_dict_t *fp, const char *str,
|
||||
fp->ctf_str_prov_offset += strlen (atom->csa_str) + 1;
|
||||
}
|
||||
|
||||
if (flags & CTF_STR_PENDING_REF)
|
||||
if (add_ref)
|
||||
{
|
||||
if (ctf_dynset_insert (fp->ctf_str_pending_ref, (void *) ref) < 0)
|
||||
goto oom;
|
||||
}
|
||||
else if (flags & CTF_STR_ADD_REF)
|
||||
{
|
||||
ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref);
|
||||
ctf_list_append (&atom->csa_refs, aref);
|
||||
fp->ctf_str_num_refs++;
|
||||
}
|
||||
@@ -272,7 +250,7 @@ ctf_str_add (ctf_dict_t *fp, const char *str)
|
||||
if (!str)
|
||||
str = "";
|
||||
|
||||
atom = ctf_str_add_ref_internal (fp, str, CTF_STR_MAKE_PROVISIONAL, 0);
|
||||
atom = ctf_str_add_ref_internal (fp, str, FALSE, TRUE, 0);
|
||||
if (!atom)
|
||||
return 0;
|
||||
|
||||
@@ -290,47 +268,13 @@ ctf_str_add_ref (ctf_dict_t *fp, const char *str, uint32_t *ref)
|
||||
if (!str)
|
||||
str = "";
|
||||
|
||||
atom = ctf_str_add_ref_internal (fp, str, CTF_STR_ADD_REF
|
||||
| CTF_STR_MAKE_PROVISIONAL, ref);
|
||||
atom = ctf_str_add_ref_internal (fp, str, TRUE, TRUE, ref);
|
||||
if (!atom)
|
||||
return 0;
|
||||
|
||||
return atom->csa_offset;
|
||||
}
|
||||
|
||||
/* Like ctf_str_add_ref(), but notes that this memory location must be added as
|
||||
a ref by a later serialization phase, rather than adding it itself. */
|
||||
uint32_t
|
||||
ctf_str_add_pending (ctf_dict_t *fp, const char *str, uint32_t *ref)
|
||||
{
|
||||
ctf_str_atom_t *atom;
|
||||
|
||||
if (!str)
|
||||
str = "";
|
||||
|
||||
atom = ctf_str_add_ref_internal (fp, str, CTF_STR_PENDING_REF
|
||||
| CTF_STR_MAKE_PROVISIONAL, ref);
|
||||
if (!atom)
|
||||
return 0;
|
||||
|
||||
return atom->csa_offset;
|
||||
}
|
||||
|
||||
/* Note that a pending ref now located at NEW_REF has moved by BYTES bytes. */
|
||||
int
|
||||
ctf_str_move_pending (ctf_dict_t *fp, uint32_t *new_ref, ptrdiff_t bytes)
|
||||
{
|
||||
if (bytes == 0)
|
||||
return 0;
|
||||
|
||||
if (ctf_dynset_insert (fp->ctf_str_pending_ref, (void *) new_ref) < 0)
|
||||
return (ctf_set_errno (fp, ENOMEM));
|
||||
|
||||
ctf_dynset_remove (fp->ctf_str_pending_ref,
|
||||
(void *) ((signed char *) new_ref - bytes));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Add an external strtab reference at OFFSET. Returns zero if the addition
|
||||
failed, nonzero otherwise. */
|
||||
int
|
||||
@@ -341,7 +285,7 @@ ctf_str_add_external (ctf_dict_t *fp, const char *str, uint32_t offset)
|
||||
if (!str)
|
||||
str = "";
|
||||
|
||||
atom = ctf_str_add_ref_internal (fp, str, 0, 0);
|
||||
atom = ctf_str_add_ref_internal (fp, str, FALSE, FALSE, 0);
|
||||
if (!atom)
|
||||
return 0;
|
||||
|
||||
@@ -391,8 +335,6 @@ ctf_str_remove_ref (ctf_dict_t *fp, const char *str, uint32_t *ref)
|
||||
free (aref);
|
||||
}
|
||||
}
|
||||
|
||||
ctf_dynset_remove (fp->ctf_str_pending_ref, (void *) ref);
|
||||
}
|
||||
|
||||
/* A ctf_dynhash_iter_remove() callback that removes atoms later than a given
|
||||
|
||||
Reference in New Issue
Block a user