diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pid.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pid.c index b145818..34ebdf6 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pid.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_pid.c @@ -130,6 +130,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) dt_dprintf("creating probe pid%d:%s:%s:%s\n", (int)pid, pp->dpp_obj, func, pp->dpp_name); +#if defined(sun) sz = sizeof (fasttrap_probe_spec_t) + (isdash ? 4 : (symp->st_size - 1) * sizeof (ftp->ftps_offs[0])); @@ -137,6 +138,20 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) dt_dprintf("proc_per_sym: dt_alloc(%lu) failed\n", sz); return (1); /* errno is set for us */ } +#else + if ((ftp = dt_alloc(dtp, sizeof(*ftp))) == NULL) { + dt_dprintf("proc_per_sym: dt_alloc(%lu) failed\n", + sizeof(*ftp)); + return (1); /* errno is set for us */ + } + + sz = isdash ? sizeof(*ftp->ftps_offs) + 4 : + (symp->st_size - 1) * sizeof (*ftp->ftps_offs); + if ((ftp->ftps_offs = dt_alloc(dtp, sz)) == NULL) { + dt_dprintf("proc_per_sym: dt_alloc(%lu) failed\n", sz); + return (1); /* errno is set for us */ + } +#endif ftp->ftps_pid = pid; (void) strncpy(ftp->ftps_func, func, sizeof (ftp->ftps_func)); @@ -213,6 +228,9 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func) pp->dpp_nmatches += nmatches; +#if !defined(sun) + dt_free(dtp, ftp->ftps_offs); +#endif dt_free(dtp, ftp); return (0); diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c index fd5508f..4ba055c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c +++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c @@ -2085,6 +2085,7 @@ fasttrap_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int fflag, if (noffs == 0) return (EINVAL); +#if defined(sun) size = sizeof (fasttrap_probe_spec_t) + sizeof (probe->ftps_offs[0]) * (noffs - 1); @@ -2093,16 +2094,23 @@ fasttrap_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int fflag, probe = kmem_alloc(size, KM_SLEEP); -#if defined(sun) if (copyin(uprobe, probe, size) != 0) { kmem_free(probe, size); return (EFAULT); } #else + size = noffs * sizeof(*probe->ftps_offs); + + if (size > 1024 * 1024) + return (ENOMEM); + + probe = kmem_alloc(sizeof(*probe), KM_SLEEP); memcpy(probe, uprobe, sizeof(*probe)); - if (noffs > 1 && copyin(uprobe + 1, probe + 1, size) != 0) { - kmem_free(probe, size); - return (EFAULT); + + probe->ftps_offs = kmem_alloc(size, KM_SLEEP); + if (copyin(uprobe->ftps_offs, probe->ftps_offs, size) != 0) { + ret = EFAULT; + goto err; } #endif @@ -2174,7 +2182,12 @@ fasttrap_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int fflag, ret = fasttrap_add_probe(probe); err: +#if defined(sun) kmem_free(probe, size); +#else + kmem_free(probe->ftps_offs, size); + kmem_free(probe, sizeof(*probe)); +#endif return (ret); diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap.h index 58967fd..fc1dc93 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fasttrap.h @@ -65,7 +65,11 @@ typedef struct fasttrap_probe_spec { uint64_t ftps_pc; uint64_t ftps_size; uint64_t ftps_noffs; +#if defined(sun) uint64_t ftps_offs[1]; +#else + uint64_t *ftps_offs; +#endif } fasttrap_probe_spec_t; typedef struct fasttrap_instr_query {