>Number:         186821
>Category:       misc
>Synopsis:       dtrace_dof_init() crashes when there is no probes section
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Feb 16 17:30:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Fedor Indutny
>Release:        11.0-CURRENT
>Organization:
Voxer Inc.
>Environment:
FreeBSD freebsd-64 11.0-CURRENT FreeBSD 11.0-CURRENT #22 b38a080(master)-dirty: 
Mon Feb 17 01:04:21 MSK 2014     
root@freebsd-64:/usr/obj/usr/home/indutny/freebsd/sys/GENERIC  amd64
>Description:
FreeBSD contains hack to resolve string symbols after loading DOF from elf 
sections. It assumes that probes section is always available, but this doesn't 
always hold.
>How-To-Repeat:
1. git clone git://github.com/joyent/node.git
2. ./configure
3. edit `config.gypi` changing `node_use_dtrace` to `true` and `uv_use_dtrace` 
to `true` too.
4. gmake -j24
5. sudo DTRACE_DOF_INIT_DEBUG=1 ./node
6. Watch it crash

>Fix:
Check if the probes section was found and skip fixing symbols if it wasn't.

Patch attached with submission follows:

commit 6140bd93bec286d5ec6648affb43e4fd4766c6eb
Author: Fedor Indutny <fedor.indu...@gmail.com>
Date:   Mon Feb 17 01:16:13 2014 +0400

    dtrace: fix SEGFAULT in drti.c
    
    Do not attempt to fix any symbols when DFO has no probes section.

diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c 
b/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
index 3b4a38c..e0b65f1 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
@@ -20,6 +20,7 @@
  */
 /*
  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2013 Voxer Inc. All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -299,6 +300,8 @@ dtrace_dof_init(void)
                        break;
        
        }
+       if (i == dof->dofh_secnum)
+               goto no_probes;
        nprobes = sec->dofs_size / sec->dofs_entsize;
        fixsymbol(e, symtabdata, symtabidx, nprobes, buf, sec, &fixedprobes,
            dofstrtab);
@@ -319,6 +322,7 @@ dtrace_dof_init(void)
                fprintf(stderr, "WARNING: some probes might "
                    "not fire or your program might crash\n");
        }
+no_probes:
 #endif
        if ((gen = ioctl(fd, DTRACEHIOC_ADDDOF, &dh)) == -1)
                dprintf(1, "DTrace ioctl failed for DOF at %p", dof);


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to