git: be6abdb25956 - stable/13 - GEOM: Skip copyin() for GCTL_PARAM_WR parameters.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 06 Apr 2022 02:45:17 UTC
The branch stable/13 has been updated by mav:
URL: https://cgit.FreeBSD.org/src/commit/?id=be6abdb259564d9a8d3d91d486b7ed2331c3bec4
commit be6abdb259564d9a8d3d91d486b7ed2331c3bec4
Author: Alexander Motin <mav@FreeBSD.org>
AuthorDate: 2022-03-07 15:57:56 +0000
Commit: Alexander Motin <mav@FreeBSD.org>
CommitDate: 2022-04-06 02:07:39 +0000
GEOM: Skip copyin() for GCTL_PARAM_WR parameters.
Kernel does not read those parameters, so copyin is pointless.
While there, replace some KASSERT()s with CTASSERT()s.
MFC after: 1 month
(cherry picked from commit 01b9c48b5dec8d4a1161e0592f04b3301c81a1f8)
---
sys/geom/geom_ctl.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
index b0e2673bdc42..5690b857a639 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"));
}
/*
@@ -169,14 +168,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;