summaryrefslogtreecommitdiffstats
path: root/cddl
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2010-05-03 18:04:17 +0000
committerkan <kan@FreeBSD.org>2010-05-03 18:04:17 +0000
commitba89ec54691d267a0696f1b817ec27de69cd28ef (patch)
treec1213ce3a18f1e15e9eb7be442b559119f0dfa18 /cddl
parent33bb944de87dcb5fa7c7c5c260ca36e8b5ad739f (diff)
downloadFreeBSD-src-ba89ec54691d267a0696f1b817ec27de69cd28ef.zip
FreeBSD-src-ba89ec54691d267a0696f1b817ec27de69cd28ef.tar.gz
Do not encode more than CTF_MAX_VLEN(1023) enum members.
CTF can not represent enums with more than CTF_MAX_VLEN members, but ctfconvert will happily ignore that limitation and create CTF section no other tool can interpret. This change is different from similar change from upstream, which just returns an error if big enum is encountered. Doing that means that every FreeBSD kernel with compiled in hwpmc will have no useable CTF information due to pmc_event enum having 1236+ members.
Diffstat (limited to 'cddl')
-rw-r--r--cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c b/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
index 6a9d67a..d95dd1d 100644
--- a/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
+++ b/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
@@ -355,14 +355,21 @@ write_type(void *arg1, void *arg2)
for (i = 0, ep = tp->t_emem; ep != NULL; ep = ep->el_next)
i++; /* count up enum members */
+ if (i > CTF_MAX_VLEN) {
+ warning("enum %s has too many values: %d > %d\n",
+ tdesc_name(tp), i, CTF_MAX_VLEN);
+ i = CTF_MAX_VLEN;
+ }
+
ctt.ctt_info = CTF_TYPE_INFO(CTF_K_ENUM, isroot, i);
write_sized_type_rec(b, &ctt, tp->t_size);
- for (ep = tp->t_emem; ep != NULL; ep = ep->el_next) {
+ for (ep = tp->t_emem; ep != NULL && i > 0; ep = ep->el_next) {
offset = strtab_insert(&b->ctb_strtab, ep->el_name);
cte.cte_name = CTF_TYPE_NAME(CTF_STRTAB_0, offset);
cte.cte_value = ep->el_number;
ctf_buf_write(b, &cte, sizeof (cte));
+ i--;
}
break;
OpenPOWER on IntegriCloud