diff options
| author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-02-14 16:52:07 +0000 |
|---|---|---|
| committer | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2018-02-12 11:56:17 +0100 |
| commit | 6c19201566ac520f0d4eef6ed2f70bf9a4815eae (patch) | |
| tree | 162080b2969a667f666270d8f45be01092bce6f9 /usr/src/lib/libdtrace/common | |
| parent | 936dcb546ca8ef4ea30e33c0e9683d48ac885adf (diff) | |
| download | illumos-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.c | 18 |
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); |
