diff options
Diffstat (limited to 'usr/src/uts/common/contract/process.c')
-rw-r--r-- | usr/src/uts/common/contract/process.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/usr/src/uts/common/contract/process.c b/usr/src/uts/common/contract/process.c index e054ffdcea..97e9be4735 100644 --- a/usr/src/uts/common/contract/process.c +++ b/usr/src/uts/common/contract/process.c @@ -236,6 +236,8 @@ ctmpl_process_set(struct ct_template *tmpl, ct_param_t *param, const cred_t *cr) str_value = (char *)param->ctpm_value; str_value[param->ctpm_size - 1] = '\0'; } else { + if (param->ctpm_size < sizeof (uint64_t)) + return (EINVAL); param_value = *(uint64_t *)param->ctpm_value; /* * No process contract parameters are > 32 bits. @@ -358,6 +360,14 @@ ctmpl_process_get(struct ct_template *template, ct_param_t *param) ctmpl_process_t *ctp = template->ctmpl_data; uint64_t *param_value = param->ctpm_value; + if (param->ctpm_id == CTPP_SUBSUME || + param->ctpm_id == CTPP_PARAMS || + param->ctpm_id == CTPP_EV_FATAL) { + if (param->ctpm_size < sizeof (uint64_t)) + return (EINVAL); + param->ctpm_size = sizeof (uint64_t); + } + switch (param->ctpm_id) { case CTPP_SUBSUME: *param_value = ctp->ctp_subsume ? |