diff options
author | markj <markj@FreeBSD.org> | 2017-02-03 00:50:41 +0000 |
---|---|---|
committer | markj <markj@FreeBSD.org> | 2017-02-03 00:50:41 +0000 |
commit | 6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3 (patch) | |
tree | 0d244aba7dd349364f73c5ca575f3cc964fd17a7 /cddl/contrib/opensolaris | |
parent | ff25f93f1bdb9d4b518f64589de5fa745f79fafa (diff) | |
download | FreeBSD-src-6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3.zip FreeBSD-src-6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3.tar.gz |
MFC r310332:
Avoid modifying the object string table when patching USDT probes.
Diffstat (limited to 'cddl/contrib/opensolaris')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c index ba5919d..f13e107 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c @@ -1223,6 +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"; + char probename[DTRACE_NAMELEN]; int fd, i, ndx, eprobe, mod = 0; Elf *elf = NULL; GElf_Ehdr ehdr; @@ -1576,8 +1577,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 +1627,14 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) "no such provider %s", pname)); } - if ((prp = dt_probe_lookup(pvp, p)) == NULL) { + if (strlcpy(probename, p + 3, sizeof (probename)) >= + sizeof (probename)) return (dt_link_error(dtp, elf, fd, bufs, - "no such probe %s", p)); - } + "invalid probe name %s", probename)); + (void) strhyphenate(probename); + if ((prp = dt_probe_lookup(pvp, probename)) == NULL) + return (dt_link_error(dtp, elf, fd, bufs, + "no such probe %s", probename)); assert(fsym.st_value <= rela.r_offset); |