diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c index ba5919d9d6b7..9d5456f41f81 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c @@ -1223,7 +1223,7 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) static const char dt_enabled[] = "enabled"; static const char dt_symprefix[] = "$dtrace"; static const char dt_symfmt[] = "%s%ld.%s"; - int fd, i, ndx, eprobe, mod = 0; + int error, fd, i, ndx, eprobe, mod = 0; Elf *elf = NULL; GElf_Ehdr ehdr; Elf_Scn *scn_rel, *scn_sym, *scn_str, *scn_tgt; @@ -1576,8 +1576,6 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) bcopy(s, pname, p - s); pname[p - s] = '\0'; - p = strhyphenate(p + 3); /* strlen("___") */ - if (dt_symtab_lookup(data_sym, isym, rela.r_offset, shdr_rel.sh_info, &fsym, (emachine1 == EM_PPC64), elf) != 0) @@ -1628,10 +1626,15 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) "no such provider %s", pname)); } + p = strdup(p + 3); /* strlen("___") */ + (void) strhyphenate(p); if ((prp = dt_probe_lookup(pvp, p)) == NULL) { - return (dt_link_error(dtp, elf, fd, bufs, - "no such probe %s", p)); + error = dt_link_error(dtp, elf, fd, bufs, + "no such probe %s", p); + free(p); + return (error); } + free(p); assert(fsym.st_value <= rela.r_offset);