summaryrefslogtreecommitdiffstats
path: root/cddl
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2017-02-03 00:50:41 +0000
committermarkj <markj@FreeBSD.org>2017-02-03 00:50:41 +0000
commit6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3 (patch)
tree0d244aba7dd349364f73c5ca575f3cc964fd17a7 /cddl
parentff25f93f1bdb9d4b518f64589de5fa745f79fafa (diff)
downloadFreeBSD-src-6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3.zip
FreeBSD-src-6e2b8645b967cf5dbb9221aedbd3487f0ccd63d3.tar.gz
MFC r310332:
Avoid modifying the object string table when patching USDT probes.
Diffstat (limited to 'cddl')
-rw-r--r--cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c13
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);
OpenPOWER on IntegriCloud