libctf: prohibit nameless ints, floats, typedefs and forwards
authorNick Alcock <nick.alcock@oracle.com>
Wed, 27 Jan 2021 19:55:45 +0000 (19:55 +0000)
committerNick Alcock <nick.alcock@oracle.com>
Thu, 4 Feb 2021 16:01:53 +0000 (16:01 +0000)
Now that "anonymous typedef nodes" have been extirpated, we can mandate
that things that have names in C must have names in CTF too.  (Unlike
the no-forwards embarrassment, the deduplicator does nothing special
with names: types that have names in C will have the same name in CTF.
So we can assume that the CTF rules and the C rules are the same.)

include/ChangeLog
2021-01-27  Nick Alcock  <nick.alcock@oracle.com>

* ctf-api.h (ECTF_NONAME): New.
(ECTF_NERR): Adjust.

libctf/ChangeLog
2021-01-27  Nick Alcock  <nick.alcock@oracle.com>

* ctf-create.c (ctf_add_encoded): Add check for non-empty name.
(ctf_add_forward): Likewise.
(ctf_add_typedef): Likewise.

include/ChangeLog
include/ctf-api.h
libctf/ChangeLog
libctf/ctf-create.c

index 163b5062660f9d1541d9504ae31db6a03cce5465..56a9a6117f5c4c66c8895b5b926dc16f79234c90 100644 (file)
@@ -1,3 +1,8 @@
+2021-01-27  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-api.h (ECTF_NONAME): New.
+       (ECTF_NERR): Adjust.
+
 2021-01-26  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-api.h (CTF_LINK_NO_FILTER_REPORTED_SYMS): New.
index 954778a950114deb0630ffea528c6d16506ab01b..6dd43aa365f15c9d42a5e8cc049298119b2907b9 100644 (file)
@@ -240,7 +240,8 @@ typedef struct ctf_snapshot_id
   _CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \
   _CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \
   _CTF_ITEM (ECTF_NEEDSBFD, "This feature needs a libctf with BFD support.") \
-  _CTF_ITEM (ECTF_INCOMPLETE, "Type is not a complete type.")
+  _CTF_ITEM (ECTF_INCOMPLETE, "Type is not a complete type.") \
+  _CTF_ITEM (ECTF_NONAME, "Type name must not be empty.")
 
 #define        ECTF_BASE       1000    /* Base value for libctf errnos.  */
 
@@ -253,7 +254,7 @@ _CTF_ERRORS
 #undef _CTF_FIRST
   };
 
-#define ECTF_NERR (ECTF_INCOMPLETE - ECTF_BASE + 1) /* Count of CTF errors.  */
+#define ECTF_NERR (ECTF_NONAME - ECTF_BASE + 1) /* Count of CTF errors.  */
 
 /* The CTF data model is inferred to be the caller's data model or the data
    model of the given object, unless ctf_setmodel is explicitly called.  */
index 9b0dad92b0710e9c9e470cb916d5310242ab329a..10178bca86d2cd14ab84da7833e819fdac961bad 100644 (file)
@@ -1,3 +1,9 @@
+2021-01-27  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-create.c (ctf_add_encoded): Add check for non-empty name.
+       (ctf_add_forward): Likewise.
+       (ctf_add_typedef): Likewise.
+
 2021-01-27  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-open.c (init_types): Rip out code to check anonymous typedef
index cf47384284687aa849aea716aac73bf4c6ffb2da..cf12557b5d54618b571048cd3388164dc5e5e3d8 100644 (file)
@@ -1595,6 +1595,9 @@ ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
   if (ep == NULL)
     return (ctf_set_errno (fp, EINVAL));
 
+  if (name == NULL || name[0] == '\0')
+    return (ctf_set_errno (fp, ECTF_NONAME));
+
   if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
     return CTF_ERR;            /* errno is set for us.  */
 
@@ -1961,11 +1964,13 @@ ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
   if (!ctf_forwardable_kind (kind))
     return (ctf_set_errno (fp, ECTF_NOTSUE));
 
+  if (name == NULL || name[0] == '\0')
+    return (ctf_set_errno (fp, ECTF_NONAME));
+
   /* If the type is already defined or exists as a forward tag, just
      return the ctf_id_t of the existing definition.  */
 
-  if (name != NULL)
-    type = ctf_lookup_by_rawname (fp, kind, name);
+  type = ctf_lookup_by_rawname (fp, kind, name);
 
   if (type)
     return type;
@@ -1990,6 +1995,9 @@ ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
     return (ctf_set_errno (fp, EINVAL));
 
+  if (name == NULL || name[0] == '\0')
+    return (ctf_set_errno (fp, ECTF_NONAME));
+
   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
     return CTF_ERR;            /* errno is set for us.  */