aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/geom/geom_ctl.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
index c387b9e5102c..ce308d236dc1 100644
--- a/sys/geom/geom_ctl.c
+++ b/sys/geom/geom_ctl.c
@@ -63,16 +63,15 @@ static struct cdevsw g_ctl_cdevsw = {
.d_name = "g_ctl",
};
+CTASSERT(GCTL_PARAM_RD == VM_PROT_READ);
+CTASSERT(GCTL_PARAM_WR == VM_PROT_WRITE);
+
void
g_ctl_init(void)
{
make_dev_credf(MAKEDEV_ETERNAL, &g_ctl_cdevsw, 0, NULL,
UID_ROOT, GID_OPERATOR, 0640, PATH_GEOM_CTL);
- KASSERT(GCTL_PARAM_RD == VM_PROT_READ,
- ("GCTL_PARAM_RD != VM_PROT_READ"));
- KASSERT(GCTL_PARAM_WR == VM_PROT_WRITE,
- ("GCTL_PARAM_WR != VM_PROT_WRITE"));
}
/*
@@ -222,14 +221,18 @@ gctl_copyin(struct gctl_req *req)
gctl_error(req, "negative param length");
break;
}
- p = geom_alloc_copyin(req, ap[i].value, ap[i].len);
- if (p == NULL)
- break;
- if ((ap[i].flag & GCTL_PARAM_ASCII) &&
- p[ap[i].len - 1] != '\0') {
- gctl_error(req, "unterminated param value");
- g_free(p);
- break;
+ if (ap[i].flag & GCTL_PARAM_RD) {
+ p = geom_alloc_copyin(req, ap[i].value, ap[i].len);
+ if (p == NULL)
+ break;
+ if ((ap[i].flag & GCTL_PARAM_ASCII) &&
+ p[ap[i].len - 1] != '\0') {
+ gctl_error(req, "unterminated param value");
+ g_free(p);
+ break;
+ }
+ } else {
+ p = g_malloc(ap[i].len, M_WAITOK | M_ZERO);
}
ap[i].kvalue = p;
ap[i].flag |= GCTL_PARAM_VALUEKERNEL;