Author: kan
Date: Fri Jun 18 16:14:37 2010
New Revision: 209306
URL: http://svn.freebsd.org/changeset/base/209306

Log:
  MFC r207578:
  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.

Modified:
  stable/8/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
Directory Properties:
  stable/8/cddl/contrib/opensolaris/   (props changed)

Modified: stable/8/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c       Fri Jun 18 
16:07:24 2010        (r209305)
+++ stable/8/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c       Fri Jun 18 
16:14:37 2010        (r209306)
@@ -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;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to