Author: delphij
Date: Fri Oct 14 22:52:46 2011
New Revision: 226370
URL: http://svn.freebsd.org/changeset/base/226370

Log:
  MFC r226082:
  
  Return proper errno when we hit error when doing sanity check.
  This fixes dtrace crashes when module is not compiled with CTF
  data.
  
  Submitted by: Paul Ambrose ambrosehua at gmail.com

Modified:
  stable/7/sys/kern/kern_ctf.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/kern/kern_ctf.c
==============================================================================
--- stable/7/sys/kern/kern_ctf.c        Fri Oct 14 22:44:51 2011        
(r226369)
+++ stable/7/sys/kern/kern_ctf.c        Fri Oct 14 22:52:46 2011        
(r226370)
@@ -164,8 +164,13 @@ link_elf_ctf_get(linker_file_t lf, linke
         * section names aren't present, then we can't locate the
         * .SUNW_ctf section containing the CTF data.
         */
-       if (hdr->e_shstrndx == 0 || shdr[hdr->e_shstrndx].sh_type != SHT_STRTAB)
+       if (hdr->e_shstrndx == 0 || shdr[hdr->e_shstrndx].sh_type != 
SHT_STRTAB) {
+               printf("%s(%d): module %s e_shstrndx is %d, sh_type is %d\n",
+                   __func__, __LINE__, lf->pathname, hdr->e_shstrndx,
+                   shdr[hdr->e_shstrndx].sh_type);
+               error = EFTYPE;
                goto out;
+       }
 
        /* Allocate memory to buffer the section header strings. */
        if ((shstrtab = malloc(shdr[hdr->e_shstrndx].sh_size, M_LINKER,
@@ -187,8 +192,12 @@ link_elf_ctf_get(linker_file_t lf, linke
                        break;
 
        /* Check if the CTF section wasn't found. */
-       if (i >= hdr->e_shnum)
+       if (i >= hdr->e_shnum) {
+               printf("%s(%d): module %s has no .SUNW_ctf section\n",
+                   __func__, __LINE__, lf->pathname);
+               error = EFTYPE;
                goto out;
+       }
 
        /* Read the CTF header. */
        if ((error = vn_rdwr(UIO_READ, nd.ni_vp, ctf_hdr, sizeof(ctf_hdr),
@@ -197,12 +206,21 @@ link_elf_ctf_get(linker_file_t lf, linke
                goto out;
 
        /* Check the CTF magic number. (XXX check for big endian!) */
-       if (ctf_hdr[0] != 0xf1 || ctf_hdr[1] != 0xcf)
+       if (ctf_hdr[0] != 0xf1 || ctf_hdr[1] != 0xcf) {
+               printf("%s(%d): module %s has invalid format\n",
+                   __func__, __LINE__, lf->pathname);
+               error = EFTYPE;
                goto out;
+       }
 
        /* Check if version 2. */
-       if (ctf_hdr[2] != 2)
+       if (ctf_hdr[2] != 2) {
+               printf("%s(%d): module %s CTF format version is %d "
+                   "(2 expected)\n",
+                   __func__, __LINE__, lf->pathname, ctf_hdr[2]);
+               error = EFTYPE;
                goto out;
+       }
 
        /* Check if the data is compressed. */
        if ((ctf_hdr[3] & 0x1) != 0) {
_______________________________________________
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