diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-11-30 18:23:36 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-11-30 18:23:36 +0000 |
commit | 319ffd7b00d357d8bcc5a3ab337a6a870bf0faa6 (patch) | |
tree | cba2efb64a7d78bb88df67041ecbf6c151bba31f /usr/src | |
parent | 4eed297057391737dc291a0785b72d9fc497f4a2 (diff) | |
download | illumos-joyent-319ffd7b00d357d8bcc5a3ab337a6a870bf0faa6.tar.gz |
OS-6395 improve DTrace error checking
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Tim Kordas <tim.kordas@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/dtrace/dtrace.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/usr/src/uts/common/dtrace/dtrace.c b/usr/src/uts/common/dtrace/dtrace.c index f5ce5608aa..9b53e08b6a 100644 --- a/usr/src/uts/common/dtrace/dtrace.c +++ b/usr/src/uts/common/dtrace/dtrace.c @@ -13195,6 +13195,7 @@ static int dtrace_dof_relocate(dof_hdr_t *dof, dof_sec_t *sec, uint64_t ubase) { uintptr_t daddr = (uintptr_t)dof; + uintptr_t ts_end; dof_relohdr_t *dofr = (dof_relohdr_t *)(uintptr_t)(daddr + sec->dofs_offset); dof_sec_t *ss, *rs, *ts; @@ -13210,6 +13211,7 @@ dtrace_dof_relocate(dof_hdr_t *dof, dof_sec_t *sec, uint64_t ubase) ss = dtrace_dof_sect(dof, DOF_SECT_STRTAB, dofr->dofr_strtab); rs = dtrace_dof_sect(dof, DOF_SECT_RELTAB, dofr->dofr_relsec); ts = dtrace_dof_sect(dof, DOF_SECT_NONE, dofr->dofr_tgtsec); + ts_end = (uintptr_t)ts + sizeof (dof_sec_t); if (ss == NULL || rs == NULL || ts == NULL) return (-1); /* dtrace_dof_error() has been called already */ @@ -13236,6 +13238,11 @@ dtrace_dof_relocate(dof_hdr_t *dof, dof_sec_t *sec, uint64_t ubase) return (-1); } + if (taddr >= (uintptr_t)ts && taddr < ts_end) { + dtrace_dof_error(dof, "bad relocation offset"); + return (-1); + } + if (!IS_P2ALIGNED(taddr, sizeof (uint64_t))) { dtrace_dof_error(dof, "misaligned setx relo"); return (-1); |