summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/contract/process.c
diff options
context:
space:
mode:
authorAntonello Cruz <Antonello.Cruz@Sun.COM>2008-10-24 12:57:08 -0700
committerAntonello Cruz <Antonello.Cruz@Sun.COM>2008-10-24 12:57:08 -0700
commitc5a9a4fc75359f623d03e4eab6a03c9cabe175a3 (patch)
tree545e7bf9b55a6e84eb99bd47b8425375a3c9df51 /usr/src/uts/common/contract/process.c
parent4f2e01b27b6f050ac264ee29e4fea7a9045ce86e (diff)
downloadillumos-joyent-c5a9a4fc75359f623d03e4eab6a03c9cabe175a3.tar.gz
6753802 procfs may access kernel data it shouldn't
Diffstat (limited to 'usr/src/uts/common/contract/process.c')
-rw-r--r--usr/src/uts/common/contract/process.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/usr/src/uts/common/contract/process.c b/usr/src/uts/common/contract/process.c
index 97e9be4735..4b5d4d0ae8 100644
--- a/usr/src/uts/common/contract/process.c
+++ b/usr/src/uts/common/contract/process.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/mutex.h>
#include <sys/debug.h>
#include <sys/types.h>
@@ -223,9 +221,11 @@ ctmpl_process_free(struct ct_template *template)
* the desired terms.
*/
static int
-ctmpl_process_set(struct ct_template *tmpl, ct_param_t *param, const cred_t *cr)
+ctmpl_process_set(struct ct_template *tmpl, ct_kparam_t *kparam,
+ const cred_t *cr)
{
ctmpl_process_t *ctp = tmpl->ctmpl_data;
+ ct_param_t *param = &kparam->param;
contract_t *ct;
int error;
uint64_t param_value;
@@ -233,12 +233,12 @@ ctmpl_process_set(struct ct_template *tmpl, ct_param_t *param, const cred_t *cr)
if ((param->ctpm_id == CTPP_SVC_FMRI) ||
(param->ctpm_id == CTPP_CREATOR_AUX)) {
- str_value = (char *)param->ctpm_value;
+ str_value = (char *)kparam->ctpm_kbuf;
str_value[param->ctpm_size - 1] = '\0';
} else {
if (param->ctpm_size < sizeof (uint64_t))
return (EINVAL);
- param_value = *(uint64_t *)param->ctpm_value;
+ param_value = *(uint64_t *)kparam->ctpm_kbuf;
/*
* No process contract parameters are > 32 bits.
* Unless it is a string.
@@ -355,17 +355,18 @@ ctmpl_process_set(struct ct_template *tmpl, ct_param_t *param, const cred_t *cr)
* returns the requested term.
*/
static int
-ctmpl_process_get(struct ct_template *template, ct_param_t *param)
+ctmpl_process_get(struct ct_template *template, ct_kparam_t *kparam)
{
ctmpl_process_t *ctp = template->ctmpl_data;
- uint64_t *param_value = param->ctpm_value;
+ ct_param_t *param = &kparam->param;
+ uint64_t *param_value = kparam->ctpm_kbuf;
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);
+ kparam->ret_size = sizeof (uint64_t);
}
switch (param->ctpm_id) {
@@ -378,28 +379,28 @@ ctmpl_process_get(struct ct_template *template, ct_param_t *param)
break;
case CTPP_SVC_FMRI:
if (ctp->ctp_svc_fmri == NULL) {
- param->ctpm_size =
- strlcpy((char *)param->ctpm_value,
+ kparam->ret_size =
+ strlcpy((char *)kparam->ctpm_kbuf,
CT_PR_SVC_DEFAULT, param->ctpm_size);
} else {
- param->ctpm_size =
- strlcpy((char *)param->ctpm_value,
+ kparam->ret_size =
+ strlcpy((char *)kparam->ctpm_kbuf,
refstr_value(ctp->ctp_svc_fmri), param->ctpm_size);
}
- param->ctpm_size++;
+ kparam->ret_size++;
break;
case CTPP_CREATOR_AUX:
if (ctp->ctp_svc_aux == NULL) {
- param->ctpm_size =
- strlcpy((char *)param->ctpm_value,
+ kparam->ret_size =
+ strlcpy((char *)kparam->ctpm_kbuf,
refstr_value(conp_svc_aux_default),
param->ctpm_size);
} else {
- param->ctpm_size =
- strlcpy((char *)param->ctpm_value,
+ kparam->ret_size =
+ strlcpy((char *)kparam->ctpm_kbuf,
refstr_value(ctp->ctp_svc_aux), param->ctpm_size);
}
- param->ctpm_size++;
+ kparam->ret_size++;
break;
case CTPP_EV_FATAL:
*param_value = ctp->ctp_ev_fatal;