summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdtrace/common
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2017-02-14 16:52:07 +0000
committerHans Rosenfeld <hans.rosenfeld@joyent.com>2018-02-12 11:56:17 +0100
commit6c19201566ac520f0d4eef6ed2f70bf9a4815eae (patch)
tree162080b2969a667f666270d8f45be01092bce6f9 /usr/src/lib/libdtrace/common
parent936dcb546ca8ef4ea30e33c0e9683d48ac885adf (diff)
downloadillumos-joyent-6c19201566ac520f0d4eef6ed2f70bf9a4815eae.tar.gz
6653 dtrace modifies ELF string table causing problems for linker
Reviewed by: Andy Fiddaman <andy@omniosce.org> Reviewed by: Rich Lowe <richlowe@richlowe.net> Reviewed by: Yuri Pankov <yuripv@yuripv.net> Reviewed by: Andrew Stormont <andyjstormont@gmail.com> Reviewed by: Dominik Hassler <hadfl@omniosce.org> Approved by: Hans Rosenfeld <hans.rosenfeld@joyent.com>
Diffstat (limited to 'usr/src/lib/libdtrace/common')
-rw-r--r--usr/src/lib/libdtrace/common/dt_link.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_link.c b/usr/src/lib/libdtrace/common/dt_link.c
index e910ac3ff1..b8b75d8ac2 100644
--- a/usr/src/lib/libdtrace/common/dt_link.c
+++ b/usr/src/lib/libdtrace/common/dt_link.c
@@ -22,10 +22,9 @@
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2016 Mark Johnston.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#define ELF_TARGET_ALL
#include <elf.h>
@@ -1013,6 +1012,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%d.%s";
+ char probename[DTRACE_NAMELEN];
int fd, i, ndx, eprobe, mod = 0;
Elf *elf = NULL;
GElf_Ehdr ehdr;
@@ -1355,8 +1355,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) != 0)
goto err;
@@ -1406,9 +1404,17 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
"no such provider %s", pname));
}
- if ((prp = dt_probe_lookup(pvp, p)) == NULL) {
+ /* strlen("___") */
+ if (strlcpy(probename, p + 3, sizeof (probename)) >=
+ sizeof (probename))
+ return (dt_link_error(dtp, elf, fd, bufs,
+ "probe name too long %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", p));
+ "no such probe %s", probename));
}
assert(fsym.st_value <= rela.r_offset);