aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-create.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-01-19 12:45:18 +0000
committerNick Alcock <nick.alcock@oracle.com>2021-01-19 12:45:20 +0000
commit26503e2f5eae6019c8649a3dd204a82705efc740 (patch)
tree8fc3af414a9e4af4fb532b64a8492a1ae434142a /libctf/ctf-create.c
parente05a3e5a491a8ef2079eef558bbe8e9feb0b3c03 (diff)
downloadbinutils-26503e2f5eae6019c8649a3dd204a82705efc740.zip
binutils-26503e2f5eae6019c8649a3dd204a82705efc740.tar.gz
binutils-26503e2f5eae6019c8649a3dd204a82705efc740.tar.bz2
libctf, create: fix ctf_type_add of structs with unnamed members
Our recent commit to support unnamed structure members better ditched the old ctf_member_iter iterator body in favour of ctf_member_next. However, these functions treat unnamed structure members differently: ctf_member_iter just returned whatever the internal representation contained, while ctf_member_next took care to always return "" rather than sometimes returning "" and sometimes NULL depending on whether the dict was dynamic (a product of ctf_create) or not (a product of ctf_open). After this commit, ctf_member_iter did the same. It was always a bug for external callers not to treat a "" return from these functions as if it were NULL, so only buggy callers could be affected -- but one of those buggy callers was ctf_add_type, which assumed that it could just take whatever name was returned from ctf_member_iter and slam it directly into the internal representation of a dynamic dict -- which expects NULL for unnamed members, not "". The net effect of all of this is that taking a struct containing unnamed members and ctf_add_type'ing it into a dynamic dict produced a dict whose unnamed members were inaccessible to ctf_member_info (though if you wrote that dict out and then ctf_open'ed it, they would magically reappear again). Compensate for this by suitably transforming a "" name into NULL in the internal representation, as should have been done all along. libctf/ChangeLog 2021-01-19 Nick Alcock <nick.alcock@oracle.com> * ctf-create.c (membadd): Transform ""-named members into NULL-named ones. * testsuite/libctf-regression/type-add-unnamed-struct*: New test.
Diffstat (limited to 'libctf/ctf-create.c')
-rw-r--r--libctf/ctf-create.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index 651d39d..50f48eb 100644
--- a/libctf/ctf-create.c
+++ b/libctf/ctf-create.c
@@ -2403,6 +2403,12 @@ membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
+ /* Unnamed members in non-dynamic dicts have a name of "", while dynamic dicts
+ use NULL. Adapt. */
+
+ if (name[0] == 0)
+ name = NULL;
+
if (name != NULL && (s = strdup (name)) == NULL)
{
free (dmd);