>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"