summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdtrace/common
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2020-01-04 20:05:30 +0200
committerToomas Soome <tsoome@me.com>2020-01-13 19:52:08 +0200
commitb63b86d12b5ac4c5450c67c1222a35f224f5d0e4 (patch)
tree429fc064c1116efdbef75ccc930bde0df9c28d0c /usr/src/lib/libdtrace/common
parent2c687d6826d5cbe1435931df7165d210c3336019 (diff)
downloadillumos-joyent-b63b86d12b5ac4c5450c67c1222a35f224f5d0e4.tar.gz
12158 libdtrace: argument to 'alloca' may be too large
Reviewed by: Matthias Scheler <mscheler@tintri.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/lib/libdtrace/common')
-rw-r--r--usr/src/lib/libdtrace/common/dt_options.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_options.c b/usr/src/lib/libdtrace/common/dt_options.c
index 201b50a177..66366c65b4 100644
--- a/usr/src/lib/libdtrace/common/dt_options.c
+++ b/usr/src/lib/libdtrace/common/dt_options.c
@@ -698,7 +698,7 @@ dt_opt_rate(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
char *name;
hrtime_t mul;
} suffix[] = {
- { "ns", NANOSEC / NANOSEC },
+ { "ns", NANOSEC / NANOSEC },
{ "nsec", NANOSEC / NANOSEC },
{ "us", NANOSEC / MICROSEC },
{ "usec", NANOSEC / MICROSEC },
@@ -875,15 +875,19 @@ dt_options_load(dtrace_hdl_t *dtp)
if (hdr.dofh_loadsz < sizeof (dof_hdr_t))
return (dt_set_errno(dtp, EINVAL));
- dof = alloca(hdr.dofh_loadsz);
- bzero(dof, sizeof (dof_hdr_t));
+ dof = calloc(1, hdr.dofh_loadsz);
+ if (dof == NULL)
+ return (dt_set_errno(dtp, errno));
+
dof->dofh_loadsz = hdr.dofh_loadsz;
for (i = 0; i < DTRACEOPT_MAX; i++)
dtp->dt_options[i] = DTRACEOPT_UNSET;
- if (dt_ioctl(dtp, DTRACEIOC_DOFGET, dof) == -1)
+ if (dt_ioctl(dtp, DTRACEIOC_DOFGET, dof) == -1) {
+ free(dof);
return (dt_set_errno(dtp, errno));
+ }
for (i = 0; i < dof->dofh_secnum; i++) {
sec = (dof_sec_t *)(uintptr_t)((uintptr_t)dof +
@@ -908,6 +912,7 @@ dt_options_load(dtrace_hdl_t *dtp)
dtp->dt_options[opt->dofo_option] = opt->dofo_value;
}
+ free(dof);
return (0);
}